如果不适用,请忽略JavaScript函数

时间:2015-08-30 18:19:58

标签: javascript

我有这个函数可以改变我无法控制的某些标记的元素。它一直很好用,但在某些页面上 - 没有该名称的元素。我的JS全部编译成一个文件 - 所以在没有匹配的页面上,我得到一个error: Uncaught TypeError: Cannot read property 'attributes' of undefined

(function($) {
    $.fn.changeElementType = function(newType) {

        // create object to store attributes
        var attrs = {};

        // save out the values to that object
        $.each(this[0].attributes, function(idx, attr) {
            attrs[attr.nodeName] = attr.nodeValue;
        });

        // replace the element itself - and put the original values back
        this.replaceWith(function() {
            return $("<" + newType + "/>", attrs).append($(this).contents());
        });
    };
})(jQuery);

(例如,这应该是一个列表,而不仅仅是吨的div) $('.list-view').changeElementType('ul');

所以我的直觉就是放一个if语句或其他东西,这样如果没有匹配 - 它就不会妨碍它。 - 但我不确定要采取什么方向。

我以前几乎都使用函数表达式,所以我认为这就是为什么我从来没有真正需要处理这个问题。

1 个答案:

答案 0 :(得分:1)

如果我正确地阅读了你的问题,你可以在没有匹配的情况下返回。如果this.length0,则会发生这种情况。例如,您可以将代码更改为以下内容:

(function($) {
    $.fn.changeElementType = function(newType) {

        // If there is no match, return
        if (this.length === 0) return;

        // create object to store attributes
        var attrs = {};

        // save out the values to that object
        $.each(this[0].attributes, function(idx, attr) {
            attrs[attr.nodeName] = attr.nodeValue;
        });

        // replace the element itself - and put the original values back
        this.replaceWith(function() {
            return $("<" + newType + "/>", attrs).append($(this).contents());
        });
    };
})(jQuery);