views:

374

answers:

2

Hi All

I have made a Web page using jquery and php where all files are used in a modular style. Now I have two JavaScript files which must communicate with each other. One Script generates a variable (*id_menu_bar*) which contains a number. I want that this variable gets transported to the second JavaScript and is used there.

How do I make that?

Here the Script

menu_bar.js

$(document).ready(function() {

function wrapper_action(id_menu_bar) {
  $(".wrapper").animate({height: "0px"});
  $("#changer p").click(function() {
    $(".wrapper").animate({height: "300px"});
  });
}

  $("#select_place li").live("click", function() {
  var wrapper_id = $(".wrapper").attr("id");
  var id_place = this.id;

  if (wrapper_id != "place")
    {
    $("#select_level li").remove();
      $("#select_building").load("menu_bar/menu_bar_building.php?placeitem="+id_place, function() {
        $("#select_building li").click(function() {
        var id_building = this.id;

          if (wrapper_id != "building")
            {
            $("#select_level").load("menu_bar/menu_bar_level.php?buildingitem="+id_building, function() {
              $("#select_level li").click(function() {
                var id_level = this.id;
                wrapper_action(id_level);
              });
            });

            }
          else if (wrapper_id == "building")
            {wrapper_action(id_building);}
        });
      });

      }
   else if (wrapper_id == "place")
    {wrapper_action(id_place);}
   });

});
+4  A: 

if the variable id_menu_bar is in global scope then it can be used by another script on the page.

jQuery's $.data() is also good for storing data against elements and means that you do not need to use a global variable and pollute the global namespace.

EDIT:

In response to your comment, there is a difference in how you declare variables that determines how they are scoped in JavaScript.

Global Variables

Outside of a function declaring a variable like

var myVariable;

or

myVariable;

will make no difference - both variables will have global scope. In fact, the second approach will give a variable global scope, even inside of a function. For example

function firstFunction() {
    // Local scope i.e. scoped to firstFunction
    var localVariable; 

    // Global scope i.e. available to all other JavaScript code running
    // in the page
    globalVariable = "I'm not really hiding";
}

function secondFunction() {
    // I can access globalVariable here but only after
    // firstFunction has been executed
    alert(globalVariable); // alerts I'm not really hiding
}

The difference in this scenario is that the alert will fail and not show the value for globalVariable upon execution of secondFunction() until firstFunction() has been executed, since this is where the variable is declared. Had the variable been declared outside of any function, the alert would have succeeded and shown the value of globalVariable

Using jQuery.data()

Using this command, you can store data in a cache object for an element. I would recommend looking at the source to see how this achieved, but it is pretty neat. Consider

  function firstFunction() {
      $.data(document,"myVariable","I'm not really hiding"); 
      globalVariable = "I'm not hiding";
  }

  function secondFunction() {
      // alerts "I'm not really hiding" but only if firstFunction is executed before
      // secondFunction
      alert($.data(document, "myVariable"));

      // alerts "I'm not hiding" but only if firstFunction is executed before
      // secondFunction
      alert(globalVariable);
  }

in this scenario, a string value "I'm not really hiding" is stored against the document object using the key string myVariable in firstFunction. This value can then be retrieved from the cache object anywhere else in the script. Attempting to read a value from the cache object without having first set it will yield undefined.

Take a look at this Working Demo for more details.

For reasons not to use Global Variables, check out this article.

Russ Cam
Yeap- @elhombre you need to think in terms of scope instead of "files". Reading something like this should help you- http://www.webdevelopersnotes.com/tutorials/javascript/global_local_variables_scope_javascript.php3
RichardOD
@RichardOD Thanks very much for the enlightening comment. I think there will not be a way around making files, because that would just lead to one big File which makes editing individual features difficult.Now I know in every File I am starting with a '$(document).ready(function()' so I am already in a scope and can't access the variables through an other Files.How Do I make it possible to just start all the files in one scope '$(document).ready(function()' in a logical way?
elhombre
A: 

Does it have to ve a JavaScript variable?

Can you store the information using the .data() function against a relevant element?

James Wiseman