1

我正在使用 jQuery.ajax() 方法加载一些代码。在这段代码中,我想要一些 jQuery-UI 小部件(滑块和日历),但它们不会出现在 IE 中。

这里有一些示例代码,您可能可以帮助我理解我哪里出错了。

将加载 jQuery-UI 小部件的代码

<script>
jQuery(document).ready(function(){
  jQuery.ajax({
    type:'post',
    url: 'file.php',
    success: function (data) {
     jQuery('.somediv').empty().html(data); 
    }
  });
});
</script>

加载的代码应该初始化 jQuery-UI 小部件

<script>
jQuery(document).ready(function(){
  jQuery('.datepicker-div').datepicker(someoptions);
  jQuery('.slider-div').slider(someoptions);
});
</script>
<div class="datepicker-div">
<div class="slider-div">

你可以看到它应该很简单。对于 FF 它工作正常,但不适用于 IE。

也许它与文档就绪声明无关?

4

3 回答 3

3

只需在成功事件中调用初始化程序:

<script>
jQuery(document).ready(function(){
  jQuery.ajax({
    type:'post',
    url: 'file.php',
    success: function (data) {
      jQuery('.somediv').empty().html(data); 
      jQuery('.datepicker-div').datepicker(someoptions);
      jQuery('.slider-div').slider(someoptions);
    }
  });
});
</script>

当然,您应该通过初始化函数来重构它:

function Initialize(){
  jQuery('.datepicker-div').datepicker(someoptions);
  jQuery('.slider-div').slider(someoptions);
}

然后让你的成功调用它,以及ready()ebent:

<script>
jQuery(document).ready(function(){
  jQuery.ajax({
    type:'post',
    url: 'file.php',
    success: function (data) {
     jQuery('.somediv').empty().html(data); 
     Initialize();
    }
  });
});
</script>

更新

我已经更仔细地阅读了你的问题,现在我完全理解了。你ready()在加载的代码中。那么你应该使用 jQuery 的load()

脚本执行

当使用没有后缀选择器表达式的 URL 调用 .load() 时,内容会在脚本被删除之前传递给 .html()。这会在脚本块被丢弃之前执行它们。但是,如果调用 .load() 时将选择器表达式附加到 URL,则脚本会在 DOM 更新之前被剥离,因此不会执行。两种情况的示例如下所示:

在这里,作为文档的一部分加载到#a 中的任何 JavaScript 都将成功执行。

$('#a').load('article.html');

于 2012-05-17T15:30:56.357 回答
0

尝试在附加 html 之前删除脚本,然后将它们添加回来。

var outHTML = data.replace(/<script>/ig,"<div class='script'>").replace(/<\/script>/ig,"</div>");
outHTML = $(outHTML);
var script = outHTML.find("div.script").detach();
$(".somediv").html(outHTML);
var s = document.createElement("script");
s.textContent = script.text();
document.body.appendChild(s);

编辑:

.find("div.script")可能需要.filter("div.script")根据您的 ajax 请求返回的内容进行更改。

于 2012-05-17T18:34:30.503 回答
0

好的,我没有找到解决问题的方法,但我找到了解决方法。

解决方法非常简单。因为在除 IE 之外的每个浏览器中,通过 ajax 加载脚本都可以正常工作,我们必须识别 IE 并将行为更改为不加载脚本而是重定向到我想要加载的站点。我在 Joomla 2.5 中做这一切,所以有一些工作要做,但基本上是下面的代码解决了这个问题。

// preparing the url
// check for ie
if (jQuery.browser.msie) {
  window.location(url);
} else {
  // do the ajax
}
于 2012-05-23T11:05:07.237 回答