0

我有一个看起来像这样的 .js 文件:

function regionmap () { 
var width = 960,
    height = 500,
    centered;

var projection = d3.geo.albersUsa()
    .scale(width)
    .translate([width / 2, height / 2]);

var path = d3.geo.path()
    .projection(projection);

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height)
    .attr("id","svg");

var states = svg.append("g")
    .attr("id", "states")



    d3.json("readme.json", function(json) {
      d3.select("svg").selectAll("path")
          .data(json.features)
          .enter()
          .append("path")
          .attr("d", path)
          .on("click", clicked)
          .append("title") 
          .text(function(d) { return d.properties.name; });
});


listofnames = new Array();
listofnames.push("Regions:");

function clicked (d) { 

    var regionname = d.properties.name;

    var currentclass = d3.select(this).attr("id") ;

    if (currentclass == "active") {
        d3.select(this).attr("id", "nonactive");
    } else {
        d3.select(this).attr("id", "active");
    }
    var contains;
    var index;
    for (var i = 0; i < listofnames.length; i++) {
        if (regionname != listofnames[i]) {
            contains = false;
        } else {
            contains = true;
            index = i;
            break;
        }
    }

    if (contains == false){
        listofnames.push(regionname);
    } else if(contains == true){

        listofnames.splice(index,1);
    }

    var x=document.getElementById("demo");
    x.innerHTML=listofnames;    
}


    function sendingvariable (){
        window.location.href = "../php/fileregions.php?name=" + listofnames; 
    }


}

问题是,当从 html 调用函数时,我首先调用函数 regionmap on click ( onclick="regionmap()) 效果很好。但是,我需要从 html 调用函数发送变量,我不能。有什么办法可以解决这个问题?

4

4 回答 4

1

您可以使用模块化模式的变体使其对外部范围可见:

function global() {
    function a() {};
    function b() {};

    // public api
    return {
        b: b
    }
}

var glob = global();
glob.b();

现在内部b函数可以全局访问,但a仍然是私有的。

于 2013-06-26T13:39:42.467 回答
0

函数 a 和 b 对全局函数范围之外的任何东西都是隐藏的(称为闭包)。您可以从包含 a 和 b 函数的全局函数(对象)返回某些内容。然后,您可以从那里调用这些函数:

function global(){
    return{
        a: function(){
           // do something on a
        },
        b: function(){
           // do something on b
        }
    }
}

// Call like so:
global().a();
于 2013-06-26T13:37:50.257 回答
0

尝试添加window.b = bfunction b()

于 2013-06-26T13:37:54.303 回答
0

如果您需要在没有 global() 局部变量的任何内容的情况下调用 a(),则可以将其声明为单独的函数。如果您需要 OOP 模型,您应该从全局创建对象,然后调用 a()。还声明必须看:

function global() {
    var a = function() { ... }
}

然后你可以这样称呼它:

var obj = new global();
obj.a();

抱歉,如果我没有正确理解您的问题。

于 2013-06-26T13:43:25.930 回答