javascript - jQuery.load()、jQuery.focus() 和链接标记之间的冲突

标签 javascript jquery css

背景故事

我正在创建一个 Web 应用程序,其中各个页面通过 jQuery .load“加载”功能。最初加载的页面是一个文件,但随着它越来越长,我决定将其拆分为一个 .html 文件、一个 .css 文件和一个 .js 文件。

奇怪的是,在 css 中使用百分比值定位的元素周围出现了一个设计缺陷。为了查看我是否在移动时修改了样式,我替换了 style 标签(省略了 link 标签)并且它工作正常。来来回回几次,我了解到只有在我使用 link 标签而不是通过 style 标签嵌入它时才会严格发生。

我想使用 link 标签,所以我试图缩小问题范围。经过一段时间的摆弄,我将其追溯到 .js 文件,特别是 $(document).ready 上的 .focus 函数的用法。如果我注释掉 .focus,一切正常。取消注释,它就会中断。

这似乎只发生在 Chrome 中。它不会出现在 FF26 或 IE11 中。

例子

A fiddle.

请注意,该问题仅出现在 Chrome 中,并且必须禁用缓存。由于 Chrome 的临时缓存禁用不会扩展到 iframe 的 iframe,direct result更易于使用。

最佳答案

jQuery 在 .load() 方法完成并且 DOM 已更新时提供回调函数。这是您想要对从外部 url 插入的元素进行操作的地方。

<script>
    $(document).ready(function() {
        $('#content').load('html/portal.html', function() {
            //now i can operate on elements loaded from html/portal.html
            //they have been inserted into the DOM
            $('input#input').focus();
        })
    });
</script>

就链接元素的引用而言,如果您想使用 javascript 从外部 url 动态加载样式表,您可以使用类似这样的 javascript 函数:

//load deferred stylesheets 
function loadStyleSheet(src) {
    if (document.createStyleSheet) {
        document.createStyleSheet(src);
    } else {
        $("head").append($("<link rel='stylesheet' href='"+src+"' type='text/css' media='screen' />"));
    }
}

如果你想加载一个外部 javascript 文件你可以使用 jQuery.getScript():

jQuery.getScript('/js/external.js');

综上所述,如果您想从外部资源加载一些内容,将其插入 DOM 并加载外部样式表和外部 javascript 资源,您可以按如下方式进行:

<!DOCTYPE html>
<html>
<head>
    <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
    <script>
        $(document).ready(function() {
            //function to load a deferred stylesheets 
            var loadStyleSheet = function(src) {
                if (document.createStyleSheet) {
                    document.createStyleSheet(src);
                } else {
                    $("head").append($("<link rel='stylesheet' href='"+src+"' type='text/css' media='screen' />"));
                }
            }

            $('#someWrapper').load('external-url.html #someWrapper > *', function() {
                loadStyleSheet('/css/external.css');
                jQuery.getScript('/js/external.js');
            })
        });

    </script>
</head>

<body>

    <div id="someWrapper">
        <!-- external content is loaded here -->
    </div>

</body>

</html>

关于javascript - jQuery.load()、jQuery.focus() 和链接标记之间的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21104018/

相关文章:

javascript - 我们可以计算两个哈希校验和之间的差异吗?

启用 JavaScript 的过度滚动

javascript - Jquery $.get() 操作 javascript 中查询产生的数据

javascript - 使用 Jquery 的多级下拉菜单

javascript - 使用 html CSS 和 javascript 创建轮播的问题

javascript - 如何在页面重新加载和自动显示时调用折叠列的状态

javascript - jquery或native无法通过ID获取元素

javascript - SPA : Separating backend administration from client side

javascript - 使用 stopPropagation 单击特定元素以外的任何地方

html - 使用 MSO 前缀调整图像属性