在页面上,我有一个iframe.在这个iframe是我需要排序的项目的集合.所有的
Javascript都在父页面上运行.我可以访问iframe文档中的列表,并使用上下文创建可排序:
var ifrDoc = $( '#iframe' ).contents(); $( '.sortable',ifrDoc ).sortable( { cursor: 'move' } );
但是,当尝试对物品进行排序时,我会发现异常行为.点击一个项目后,脚本的目标将更改为外部文档.如果您将鼠标从iframe移出,您可以通过单击移动该项目并将其放回来,但是您不能在iframe中与其进行交互.
示例:http://robertadamray.com/sortable-test.html
那么,有没有办法实现我想做的 – 最好不用在jQuery UI代码中进行黑客攻击?
解决方法
动态地将jQuery和jQuery UI添加到iframe(
demo)中:
$('iframe') .load(function() { var win = this.contentWindow,doc = win.document,body = doc.body,jQueryLoaded = false,jQuery; function loadJQueryUI() { body.removeChild(jQuery); jQuery = null; win.jQuery.ajax({ url: 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js',dataType: 'script',cache: true,success: function () { win.jQuery('.sortable').sortable({ cursor: 'move' }); } }); } jQuery = doc.createElement('script'); // based on https://gist.github.com/getify/603980 jQuery.onload = jQuery.onreadystatechange = function () { if ((jQuery.readyState && jQuery.readyState !== 'complete' && jQuery.readyState !== 'loaded') || jQueryLoaded) { return false; } jQuery.onload = jQuery.onreadystatechange = null; jQueryLoaded = true; loadJQueryUI(); }; jQuery.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js'; body.appendChild(jQuery); }) .prop('src','iframe-test.html');
更新:Andrew Ingram is correct,jQuery UI保存并使用jQuery UI加载页面的窗口和文档引用.通过将jQuery / jQuery UI加载到iframe中,它具有正确的引用(对于iframe而不是外部文档)并按预期工作.
更新2:原始代码片段有一个微妙的问题:动态脚本标签的执行顺序不能保证.我已经更新它,以便在jQuery准备好之后加载jQuery UI.
我也收集了getify的代码到load LABjs dynamically,所以不需要轮询.