【问题标题】:Dojo ready function is not getting called in ajax responseDojo 就绪函数未在 ajax 响应中调用
【发布时间】:2014-07-17 06:37:17
【问题描述】:

我有两种这样定义的表格

Home.jsp:-

 <!DOCTYPE html>
 <html>
 <head>
 <style type="text/css">
 @import "../Script/dojo-1.10/dijit/themes/claro/claro.css";
 </style>    
 <script type="text/javascript">
 dojoConfig = {
    isDebug: true,
    parseOnLoad : true
 }
 </script>
 <script type="text/javascript" lang="JavaScript" src="../Script/dojo-1.10/dojo/dojo.js"></script>
 <script type="text/javascript">
 require(["dojo/parser","dijit/form/Button",      
 "dojo/domReady!"],function(parser){
  //parser.parse();
  alert("From Require");
  });
  function getWelcomeJsp(){
  var loadResponse = dojo.byId("loadResponse");
   dojo.xhrPost({
        url:"Welcome.jsp",
        handleAs:"text",
        load:function(data){
        dojo.style(loadResponse,"display","block");
        loadResponse.innerHTML = data;
        return data;
    },
    error:function(err){
        alert("error"+err);
    }
    });
    }
    </script>
    </head>
    <body class="claro">
   <table>
   <tr><td valign="bottom">
   <a href="Welcome.jsp">This Is Hyperlink</a>
   </td></tr>
   <tr>
   <td>
   <label for="empId">EmpId:</label>
   <input id="empId" data-dojo-type="dijit/formTextBox"         
   type="text"/>
   </td></tr><tr><td>
   <button data-dojo-type="dijit/form/Button" id="buttonId"   onclick="getWelcomeJsp();">Send</button>
   </td></tr></table>
   <div id="loadResponse"></div>
   </body></html>

Welcome.jsp:-

   <!DOCTYPE html>
   <html><head>
   <style type="text/css">
      @import "../Script/dojo-1.10/dijit/themes/claro  /claro.css";</style> 
   <script type="text/javascript"  lang="JavaScript"          src="../Script/dojo-1.10/dojo/dojo.js">   </script>
    <script type="text/javascript"  lang="JavaScript">
    require(["dojo/parser","dojo/ready"],function(parser,ready){
    dojo.ready(function(){
        parser.parse();
        alert("From Ready");
    });
    });
   function myfunction(){
        alert("from welcomedd JSP");
   }
   </script></head>
   <body class="claro" onload="myfunction();">
   This Is Welcome JSP
   <button id="responseButton" data-dojo-type="dijit/form /Button" onclick="myfunction();">Response Button</button>
   </body></html>

是的,当我使用 dojo 1.9 版本单击 Home.jsp 中的超链接时,Welcome.jsp 被很好地填充,并且 Welcome.jsp 中的 ready 函数也被调用并且所有 dojo 小部件都被编译。

当我试图通过来自 Home.jsp 的 ajax 调用加载 Welcome.jsp 时,问题就来了。

Welcome.jsp 正在加载,但 Welcome.jsp 中的准备函数和 onload 函数没有被调用,这可能是 ajax 响应中的问题。 我只是无法理解这里面临的问题,请告诉我任何解决方案。

【问题讨论】:

    标签: javascript ajax jsp dojo


    【解决方案1】:

    出于安全原因,当您使用 AJAX 添加脚本并将内容设置为内部 HTML 时,Web 浏览器不会评估脚本。

    你有几个选择来解决这个问题:

    1. 如果只需要加载一些小部件,可以使用dijit/layout/ContentPane 小部件并设置href 属性。这将使用 AJAX 检索内容并自动解析所有小部件。

    2. 如果你真的想在页面上执行脚本,你必须使用eval(),查看这个答案了解更多信息:Can scripts be inserted with innerHTML?
      这实际上意味着您必须遍历动态内容上的所有脚本并在它们上使用eval()

    3. 查看dojox/layout/ContentPane 模块是在页面上执行脚本并将所有小部件解析到其上的更简单方法。它的工作方式类似于dijit/layout/ContentPane 模块,但有一个区别;它添加了一个属性executeScripts,您可以使用它来评估页面上的脚本。例如:

    <div id="loadResponse" data-dojo-type="dojox/layout/ContentPane"
        data-dojo-props="href: 'welcome.jsp', executeScripts: true"></div>
    

    【讨论】:

    • 感谢您的精彩解释,当我们通过 onClick 事件通过 ajax 调用动态加载 jsp 时,是否可以执行脚本?
    • 您可以动态设置内容窗格的href 属性(当事件发生时),通过使用dijit/registry 模块检索内容窗格并使用dijit/layout/ContentPane::set() 函数设置属性。
    【解决方案2】:

    我有另一个解决方案来解决这个问题。

    1. 一开始移除welcome.jsp和body标签中的所有脚本、css相关代码
    2. 在getWelcomeJsp()函数中,通过innerHML设置数据到div后,调用parser.parse();并将welcome.jsp中用到的所有组件写在require中。

    如果您想调用任何事件,如 keyup,请单击 .......... 使用此代码

     on(domNode,"click",function(event){
    //logic to implement
    }); 
    

    在parser.parse()之后写下这段代码;

    【讨论】:

    • 嗨,因为我已经编写了一个单独的函数 getWelcomeJsp(),所以它会抛出一个错误,说没有定义解析器。而在其他情况下 on(domNode,"click",function(evnt){ });它抛出的是空的,你能详细说明你的例子吗?
    • require(["dojo/request","dojo/parser"], function(request,parser){ request.get(url, { query: { parameter: "xyz" } })。 then(function(data){ //设置数据后 parser.parse(); }); });
    • 这个 request.get 在 dojo 中的作用是一个 ajax 调用。如果它像一个 ajax 调用,如何基于 onclick 之类的事件调用它
    • 完成了兄弟感谢您的建议。但是现在我面临这个问题 id 已经注册了什么可以解决这个问题。
    • 尝试{ dijit.byId(_8.id).destroyRecursive(); }catch(e){ //alert("error in registry.js ........我们定制的"); }
    猜你喜欢
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 2011-03-10
    • 1970-01-01
    相关资源
    最近更新 更多