2

ここに奇妙な問題があります:http: //jackyon.com.s146246.gridserver.com/thehappymonk/

queryloader2プラグインとmaximage2プラグインを使用しています。最新のすべてのブラウザで正常に動作しますが、IE8以下ではjavascriptエラーが表示されます。IE9でもエラーが表示されますが、それでも正常に実行できます。

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

いずれかのプラグインを削除すると、ページはエラーなしで実行されます。

百万ありがとうみんな!この問題はすでに数日私を夢中にさせます。私を助けてください!ありがとう!!

4

1 に答える 1

1

エラーは jquery.maximage.min.js から発生しているようです。完全なバージョンはこちら: https://github.com/akv2/MaxImage/blob/master/lib/js/jquery.maximage.js

何を探すべきかの手がかりの 1 つは、"use strict" ディレクティブがあることです。これは、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].content625 行目に次のように表示されます。

  $.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');

sinceattrは常に文字列を$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) {

この短いコードで使用されたのは、これで 3 回目です。

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

そして 4 番目は、$(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;
},

ブーツをいっぱいにしてください。:-)

于 2012-10-31T06:04:33.327 に答える