开发者问题收集

Javascript 错误:“为空或不是对象”

2012-10-31
3960

我这里有一个奇怪的问题: http://jackyon.com.s146246.gridserver.com/thehappymonk/

我正在使用 queryloader2 插件和 maximage2 插件。它在所有现代浏览器上运行良好,但在 IE8 或更低版本上显示 javascript 错误。即使 IE9 也显示错误,但它仍然可以正常运行。

js error: 'a.Slide[...].content.length' is null or not an object.

删除任一插件后,页面运行无错误。

非常感谢大家!这个问题已经让我抓狂了好几天。请帮帮我!谢谢!!

1个回答

错误似乎来自 jquery.maximage.min.js,完整版本在这里: https://github.com/akv2/MaxImage/blob/master/lib/js/jquery.maximage.js

要查找的内容的一个线索是存在“use strict”指令,这对于打算在不支持严格模式的浏览器中运行的代码来说不是一个好主意。似乎没有任何理由使用它。我猜这只是时髦。

有一些基于 UA 字符串的浏览器嗅探(不是一个好兆头):

if($.browser.msie){
  // Stop IE from continually trying to preload images that we already removed
  document.execCommand("Stop", false);
}

无论如何,错误似乎与第 226 行左右的代码有关:

for(var j in $.Slides) {

  // Determine content (if container or image)
  if($.Slides[j].content.length == 0){
    c = '<img src="' + $.Slides[j].url + '" />';

  } else {
    c = $.Slides[j].content;
  }
  ...
}

因此,寻找为 Slides[j].content 分配值的位置,在第 625 行有:

  $.Slides = Utils.construct_slide_object();

并且 construct_slide_object 是:

construct_slide_object: function() {
  var obj = new Object(),
      arr = new Array(),
      temp = '';

  $self.children().each(function(i) {
    var $img = $(this).is('img') ? $(this).clone() : $(this).find('img').first().clone();

这只是编写 $('<img />') 的一种长方法吗?

    // reset obj
    obj = {};

那么为什么要将其初始化为 each 之外的对象函数?

    // set attributes to obj
    obj.url = $img.attr('src');
    obj.title = $img.attr('title') != undefined ? $img.attr('title') : '';

这只是一个很长的写法:

    obj.title = $img.attr('title');

因为 attr 总是返回一个字符串,而 $img.attr('title') != undefined 只有在返回空字符串时才为 true。

    obj.alt = $img.attr('alt') != undefined ? $img.attr('alt') : '';
    obj.theclass = $img.attr('class') != undefined ? $img.attr('class') : '';
    obj.styles = $img.attr('style') != undefined ? $img.attr('style') : '';
    obj.orig = $img.clone();
    obj.datahref = $img.attr('data-href') != undefined ? $img.attr('data-href') : '';
    obj.content = "";

    // Setup content for within container
    if ($(this).find('img').length > 0) {

这是在这段简短的代码中第三次使用了。

      if($.BrowserTests.cssBackgroundSize) {
        $(this).find('img').first().remove();

第四次, $(this) 使用了 7 次。

      }
        obj.content = $(this).html();
      }

      // Stop loading image so we can load them sequentiallyelse{
      $img[0].src = "";

      // Remove original object (only on nonIE. IE hangs if you remove an image during load)
      if ($.BrowserTests.cssBackgroundSize) {

这似乎是某种浏览器推断:如果 backgrounsize 测试返回 false,则一定是 IE。

        $(this).remove();
      }

      // attach obj to arr
      arr.push(obj);
  });

  if(config.debug) { 
    debug(' - Slide Object - ');
    debug(arr);
  }
  return arr;
},

填写您的靴子。:-)

RobG
2012-10-31