2

我正在使用 JQuery .get 方法从网页(第 1 页)中检索一些内容并将其显示在主页的 div 中。问题是检索到的内容包含一些 javascript 调用。正在显示内容,但未执行Javascript 方法。.js 文件在所有页面中都被引用,因此主要 js 的可用性不是问题。

这是主页中的代码。第 1 页的 URL 提供给 .get 函数:

$.get(url, function(response) {          
    var newContent = $(response).find("#right");      //Find the content section of the response
    var contentWrapper = $("#wrap");         //Find the content-wrapper where we are supposed to change the content.
    var oldContent = contentWrapper.find("#right");   //Find the old content which we should replace.

    oldContent.replaceWith(newContent);
});

这是第1页#right(div)中的代码

Some html tags...    
<p><script type="text/javascript">abc7();</script></p>
<p><script>s(30)</script></p>
Some html tags...

函数 abc7 和 s 在所有页面部分中引用的 .js(普通 javascript 文件)中可用

s(30) 应该显示一个大小为 30 的文本字段。

4

2 回答 2

6

除非您在其上运行,否则内联 JavaScript 不会执行eval()。您可以在此处阅读更多相关信息:

eval()解决方案可能看起来像这样,但我认为这是不好的做法:

$.get(url, function(response) {          
    var newContent = $(response).find("#right");      //Find the content section of the response
    var contentWrapper = $("#wrap");         //Find the content-wrapper where we are supposed to change the content.
    var oldContent = contentWrapper.find("#right");   //Find the old content which we should replace.

    oldContent.replaceWith(newContent);


    //Find all inline script tags in the new content and loop through them
    newContent.find("script").each(function() {
        var scriptContent = $(this).html(); //Grab the content of this tag
        eval(scriptContent); //Execute the content
    });
});

更好的解决方案是在#right标签上设置标识符/名称并执行该特定内容所需的代码。

就像是:

<div id="right" data-page-name="index">
    <!-- Content -->
</div>

<div id="right" data-page-name="about-us">
    <!-- Content -->
</div>

一个简单的解决方案,只是将页面名称传递给将根据页面执行代码的函数,如下所示:

$.get(url, function(response) {          
    var newContent = $(response).find("#right");      //Find the content section of the response
    var contentWrapper = $("#wrap");         //Find the content-wrapper where we are supposed to change the content.
    var oldContent = contentWrapper.find("#right");   //Find the old content which we should replace.

    oldContent.replaceWith(newContent);

    var pageName = newContent.attr("data-page-name");

    pageSpecificActions(pageName);
});

function pageSpecificActions(pageName) {
    if (pageName == "index") {
        //Run the code for index page
    } else if (pageName == "about-us") {
        //Run the code for about us page.
    }   
};

这可以防止 JavaScript 代码内联并且不使用eval(). 更好的是在页面内容更改时使用事件,但现在这已经足够了。

于 2011-11-26T16:10:07.360 回答
5

您可以使用.load()function 而不是.get(). 它会自动执行响应中包含的脚本。

这是文档:.load()

于 2013-07-19T15:19:37.360 回答