How do I call a function that is defined inside of require() outside of the require()?

孤街醉人 提交于 2019-12-25 18:41:50

问题


I am using ArcGIS API for Javascript 3.21. I have a function inside of the require(). I want the function to be called when a button is clicked, but the button is outside the require().

<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="//js.arcgis.com/3.7/js/esri/css/esri.css">
<style>
    html, body, #map {
    height: 100%;
    width: 100%;
    margin: 1;
    padding: 1; 
    }
</style>

<script src="//js.arcgis.com/3.7/"></script>
<script>

    var map;

    require([
      "esri/map", 
      "esri/geometry/Point",
      "esri/symbols/SimpleMarkerSymbol",
      "esri/graphic", 
      "esri/layers/GraphicsLayer",
      "dojo/domReady!"
    ], function(
      Map, Point, SimpleMarkerSymbol, Graphic, GraphicsLayer
    ) {
      map = new Map("map", {
      basemap: "gray",
      center: [10,10],
      zoom: 3
    });

    map.on("load", function() {
      var graphicslayer = new GraphicsLayer();
      map.addLayer(graphicslayer);
    });

   function hello(){
      alert("hello,world!");
   }   

});



</script>
</head>
<body>

    <button type="submit"class="searchButton"onclick="hello()">Search</button>
    <div id="map"></div>

</body>
</html>

I can't call hello() in onclick="hello()" because hello() is inside the require().


回答1:


Your hello function is scoped to the require function. You want to scope it to the global object, which is the window object in your case. So either:

function hello(){
    alert("hello,world!");
}   
window.hello = hello;

or directly

window.hello = function(){
    alert("hello,world!");
}

But you could also bind your hello function to the click event of your object directly in javascript; you don't have to widen the scope of your function. There is likely methods to do so in the dojo library. A direct javascript way could be something like

var myButton = document.querySelectorAll("button.searchButton")[0];
if (myButton) {
    myButton.addEventListener("click", hello);
}



回答2:


any function inside require({....}), will NOT be visible to onclick='xxx('bbb')'

You have 2 choice:

1) move this function outside require({....})

2) if the function has to be inside require({....}), then you have to make it as global function by ( as @Nicolas said)

window.xxx = function(bbb){
        alert(bbb);
}



回答3:


you can't call a function inside a require to use later, because hello function is inside an anonymous function, which require function runs once, and it's not possible to recover what is inside of require function.

so, hello must be outside from require stament if u want call hello whenever you need it.




回答4:


You could also use the dojo module "On" :

Add this to your require init :

require([...,"dojo/on",...], function(...,on,...) {

Now code your event handler (assuming you add an id to your button) :

<button type="submit" class="searchButton" id="searchButton">Search</button>
on(dojo.byId('searchButton'), 'click', function(evt) {
  alert('hello');
});


来源:https://stackoverflow.com/questions/45666868/how-do-i-call-a-function-that-is-defined-inside-of-require-outside-of-the-requ

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!