需要更改此JQuery代码以在处理之前检查元素是否存在

Sam*_*lly 25 javascript jquery

我有以下代码:

            <script type="text/javascript">
            $(function () {
                $('#js-news').ticker({
                    speed: 0.10,
                    htmlFeed: false,
                    fadeInSpeed: 600,
                    titleText: 'DASHBOARD ALERTS',
                    direction: 'ltr',
                    displayType: 'reveal',
                    controls: false
                });
            });
        </script>
Run Code Online (Sandbox Code Playgroud)

我想改变它,只有当#js-news存在时它才会触发.在较旧的IE V10浏览器中,我收到错误:"DOM中不存在元素",相关页面没有js-news元素.较新的浏览器似乎应对,但不是IE7,8,9.

关于代码更改的思考表示赞赏.

谢谢.

coo*_*ter 10

首先,正如@Archer在上面的评论中指出的那样,这个插件编码不正确.当在没有元素的jQuery对象上调用其方法时,惯用的jQuery插件将无声地失败.

这里从代码中看到,这个插件无论是运行console.log()alert()如果console当没有元素不存在:

if ($(this).length == 0) {
    if (window.console && window.console.log) {
        window.console.log('Element does not exist in DOM!');
    } else {
        alert('Element does not exist in DOM!');    
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

这很糟糕.该插件确实有一个debugMode可以禁用,但它没有帮助,因为这里没有使用该标志.要修改源,您可以更改上面的第一行:

if (opts.debugMode && $(this).length == 0) {
Run Code Online (Sandbox Code Playgroud)

然后一定要debugMode:false在您的设置中进行设置.

-

但是这最终如何影响IE的是它console在开启工具关闭时没有定义对象(并且从未在IE6/7中定义),因此一个简单的解决方案是确保使用NO-OP函数定义对象.

if (!window.console) {
    window.console = {
        log: function() {}
    };
}
Run Code Online (Sandbox Code Playgroud)

现在它将console在IE中找到并调用空函数而不是触发alert().

console对象上还有其他方法可能也应该被填充,但这log()是最常见的方法.


如果您如此倾向,向开发人员提交错误报告可能不是一个坏主意.似乎该项目在过去的两年里没有更新,所以我不知道它是否会有所帮助,但它不会受到伤害.


Mil*_*war 5

添加条件以检查长度:

if($('#js-news').length){
  $('#js-news').ticker({
                speed: 0.10,
                htmlFeed: false,
                fadeInSpeed: 600,
                titleText: 'DASHBOARD ALERTS',
                direction: 'ltr',
                displayType: 'reveal',
                controls: false
  });
}
Run Code Online (Sandbox Code Playgroud)

  • 对我没有意义.如果`this`对象没有选择元素,正确编写的jQuery插件将不会执行任何操作. (6认同)