Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
升级到Drupal 7后出现Javascript错误_Javascript_Drupal 7 - Fatal编程技术网

升级到Drupal 7后出现Javascript错误

升级到Drupal 7后出现Javascript错误,javascript,drupal-7,Javascript,Drupal 7,我在Drupal论坛上发布了一个类似的问题,但我运气不好。 我正在将一个站点从D6升级到D7。到目前为止进展顺利,但我遇到了一个Javascript错误,我无法确定解决方案。 这是整个脚本的精简版本: (function($) { function sign(secret, message) { var messageBytes = str2binb(message); var secretBytes = str2binb(secret); if (secretBytes.length >

我在Drupal论坛上发布了一个类似的问题,但我运气不好。 我正在将一个站点从D6升级到D7。到目前为止进展顺利,但我遇到了一个Javascript错误,我无法确定解决方案。 这是整个脚本的精简版本:

(function($) {
function sign(secret, message) {
var messageBytes = str2binb(message);
var secretBytes = str2binb(secret);
if (secretBytes.length > 16) {
secretBytes = core_sha256(secretBytes, secret.length * chrsz);
}
var ipad = Array(16), opad = Array(16);
for (var i = 0; i < 16; i++) { 
ipad[i] = secretBytes[i] ^ 0x36363636;
opad[i] = secretBytes[i] ^ 0x5C5C5C5C;
}
var imsg = ipad.concat(messageBytes);
var ihash = core_sha256(imsg, 512 + message.length * chrsz);
var omsg = opad.concat(ihash);
var ohash = core_sha256(omsg, 512 + 256); 
var b64hash = binb2b64(ohash);
var urlhash = encodeURIComponent(b64hash);
return urlhash;
}

function addZero(n) {
return ( n < 0 || n > 9 ? "" : "0" ) + n;
}

Date.prototype.toISODate =
new Function("with (this)\nreturn " +
"getFullYear()+'-'+addZero(getMonth()+1)+'-'" +
"+addZero(getDate())+'T'+addZero(getHours())+':'" +
"+addZero(getMinutes())+':'+addZero(getSeconds())+'.000Z'");

function getNowTimeStamp() {
var time = new Date();
var gmtTime = new Date(time.getTime() + (time.getTimezoneOffset() * 60000));
return gmtTime.toISODate() ;
}
}(jQuery));
Firebug一直在addZero停止,但未定义。JS从来都不是我的强项,我知道D7已经做了一些改变。我已经将整个脚本包装在函数${}jQuery;,但我肯定错过了别的东西。同样的脚本在D6站点上也能完美地工作

下面是添加了@Pointy suggestion的整个代码的固定版本。我所遗漏的只是用于生成到Amazon的散列的脚本部分,以及我声明的一些变量

(function($) {
var typedText;
var strSearch = /asin:/;
var srchASIN;
   $(document).ready(function() {
      $("#edit-field-game-title-und-0-asin").change(function() {
         typedText = $("#edit-field-game-title-und-0-asin").val();
         $.ajax({
            type: 'POST',
            data: {typedText: typedText},
            dataType: 'text',
            url: '/asin/autocomplete/',
            success:function(){
               document.getElementById('asin-lookup').style.display='none';
               x = typedText.search(strSearch);
               y = (x+5);
               srchASIN = typedText.substr(y,10)
               amazonSearch();
            }
         });
      });  

      $("#search_asin").click(function() {
         $("#edit-field-game-title-und-0-asin").val('');
         document.getElementById('name-lookup').style.display='none';
         $("#edit-field-game-title-und-0-asin").val('');
         $("#edit-title").val('');
         $("#edit-field-subtitle-und-0-value").val('');
         $("#edit-field-game-edition-und-0-value").val('');
         $("#edit-field-release-date-und-0-value-date").val('');
         $("#edit-field-asin-und-0-asin").val('');
         $("#edit-field-ean-und-0-value").val('');
         $("#edit-field-amazon-results-und-0-value").val('');
         $("#edit-body").val('');
         srchASIN = $("#field-asin-enter").val();
         amazonSearch();
      });

      $("#clear_search").click(function() {
         $("#field-asin-enter").val(''); 
         $("#edit-field-game-title-und-0-asin").val('');
         $("#edit-title").val('');
         $("#edit-field-subtitle-und-0-value").val('');
         $("#edit-field-game-edition-und-0-value").val('');
         $("#edit-field-release-date-und-0-value-date").val('');
         $("#edit-field-release-dt2-und-0-value-date").val('');
         $("#edit-field-asin-und-0-asin").val('');
         $("#edit-field-ean-und-0-value").val('');
         $("#edit-field-amazon-results-und-0-value").val('');
         $("#field-amazon-platform").val('');
         $("#field-amazon-esrb").val('');
         $("#edit-body-und-0-value").val('');
         document.getElementById('asin-lookup').style.display='';
         document.getElementById('name-lookup').style.display='';
      });

      function amazonSearch(){
         var ASIN = srchASIN;
         var azScr = cel("script");
         azScr.setAttribute("type", "text/javascript");
         var requestUrl = invokeRequest(ASIN);
         azScr.setAttribute("src", requestUrl);
         document.getElementsByTagName("head").item(0).appendChild(azScr);
      }
   });

var amzJSONCallback = function(tmpData){
   if(tmpData.Item){
      var tmpItem = tmpData.Item;
   }
   $("#edit-title").val(tmpItem.title);
   $("#edit-field-game-edition-und-0-value").val(tmpItem.edition);
   $("#edit-field-release-date-und-0-value-date").val(tmpItem.relesdate);
   $("#edit-field-release-dt2-und-0-value-date").val(tmpItem.relesdate);
   $("#edit-field-asin-und-0-asin").val(tmpItem.asin);
   $("#edit-field-ean-und-0-value").val(tmpItem.ean);
   $("#field-amazon-platform").val(tmpItem.platform);
   $("#field-amazon-publisher").val(tmpItem.publisher);
   $("#field-amazon-esrb").val(tmpItem.esrb); 
};
function ctn(x){ return document.createTextNode(x); }
function cel(x){ return document.createElement(x); }
function addEvent(obj,type,fn){
   if (obj.addEventListener){obj.addEventListener(type,fn,false);}
   else if (obj.attachEvent){obj["e"+type+fn]=fn; obj.attachEvent("on"+type,function(){obj["e"+type+fn]();});}
}

var styleXSL = "http://www.tlthost.net/sites/vglAmazonAsin.xsl";
function invokeRequest(ASIN) {
  cleanASIN = ASIN.replace(/[-' ']/g,'');
  var unsignedUrl = "http://xml-us.amznxslt.com/onca/xml?Service=AWSECommerceService&AssociateTag=theliterarytimes&IdType=ASIN&ItemId="+cleanASIN+"&Operation=ItemLookup&ResponseGroup=Medium,ItemAttributes,OfferFull&Style="+styleXSL+"&ContentType=text/javascript&CallBack=amzJSONCallback";
    var lines = unsignedUrl.split("\n");
    unsignedUrl = "";
    for (var i in lines) { unsignedUrl += lines[i]; }
  // find host and query portions
  var urlregex = new RegExp("^http:\\/\\/(.*)\\/onca\\/xml\\?(.*)$");
  var matches = urlregex.exec(unsignedUrl);
  var host = matches[1].toLowerCase();
  var query = matches[2];
  // split the query into its constituent parts
  var pairs = query.split("&");
  // remove signature if already there
  // remove access key id if already present 
  //  and replace with the one user provided above
  // add timestamp if not already present
  pairs = cleanupRequest(pairs);
  // encode the name and value in each pair
  pairs = encodeNameValuePairs(pairs);
  // sort them and put them back together to get the canonical query string
  pairs.sort();
  var canonicalQuery = pairs.join("&");
  var stringToSign = "GET\n" + host + "\n/onca/xml\n" + canonicalQuery;
  // calculate the signature
  //var secret = getSecretAccessKey();
  var signature = sign(secret, stringToSign);
  // assemble the signed url
  var signedUrl = "http://" + host + "/onca/xml?" + canonicalQuery + "&Signature=" + signature;
  //document.write ("<html><body><pre>REQUEST: "+signedUrl+"</pre></body></html>");
  return signedUrl;
}

function encodeNameValuePairs(pairs) {
  for (var i = 0; i < pairs.length; i++) {
  var name = "";
  var value = "";
  var pair = pairs[i];
  var index = pair.indexOf("=");
  // take care of special cases like "&foo&", "&foo=&" and "&=foo&" 
  if (index == -1) {
    name = pair;
  } else if (index == 0) {
     value = pair;
  } else {
    name = pair.substring(0, index);
    if (index < pair.length - 1) {
      value = pair.substring(index + 1);
    }
  }
    // decode and encode to make sure we undo any incorrect encoding
  name = encodeURIComponent(decodeURIComponent(name));
    value = value.replace(/\+/g, "%20");
  value = encodeURIComponent(decodeURIComponent(value));
  pairs[i] = name + "=" + value;
  }   
  return pairs;
}

function cleanupRequest(pairs) {
  var haveTimestamp = false;
    var haveAwsId = false;
  var nPairs = pairs.length;
  var i = 0;
  while (i < nPairs) {
  var p = pairs[i];
  if (p.search(/^Timestamp=/) != -1) {
    haveTimestamp = true;
  } else if (p.search(/^(AWSAccessKeyId|SubscriptionId)=/) != -1) {
    pairs.splice(i, 1, "AWSAccessKeyId=" + accessKeyId);
      haveAwsId = true;
  } else if (p.search(/^Signature=/) != -1) {
    pairs.splice(i, 1);
    i--;
    nPairs--;
  }
    i++;
  }
  if (!haveTimestamp) {
    pairs.push("Timestamp=" + getNowTimeStamp());
  }
    if (!haveAwsId) {
      pairs.push("AWSAccessKeyId=" + accessKeyId);
    }
    return pairs;
}

function sign(secret, message) {
  var messageBytes = str2binb(message);
  var secretBytes = str2binb(secret);
  if (secretBytes.length > 16) {
    secretBytes = core_sha256(secretBytes, secret.length * chrsz);
  }  
  var ipad = Array(16), opad = Array(16);
  for (var i = 0; i < 16; i++) { 
    ipad[i] = secretBytes[i] ^ 0x36363636;
    opad[i] = secretBytes[i] ^ 0x5C5C5C5C;
  }
  var imsg = ipad.concat(messageBytes);
  var ihash = core_sha256(imsg, 512 + message.length * chrsz);
  var omsg = opad.concat(ihash);
  var ohash = core_sha256(omsg, 512 + 256);   
  var b64hash = binb2b64(ohash);
  var urlhash = encodeURIComponent(b64hash);
  return urlhash;
}

Date.prototype.toISODate = function() {
  function addZero(n) {
   return ( n < 0 || n > 9 ? "" : "0" ) + n;
  }
  var d = this;
  return d.getFullYear() + '-' + 
    addZero(d.getMonth() + 1) + '-' +
    addZero(d.getDate()) + 'T' +
    addZero(d.getHours()) + ':' +
    addZero(d.getMinutes()) + ':' +
    addZero(d.getSeconds()) + '.000Z';
};

  function getNowTimeStamp() {
      var time = new Date();
      var gmtTime = new Date(time.getTime() + (time.getTimezoneOffset() * 60000));
      return gmtTime.toISODate() ;
  }
}(jQuery));

下面是代码的更好版本:


这将addDate移到了扩展函数中,避免了可怕的with语句。

控制台中的错误是什么?我试图通过消除严格性来简化函数-串联中的串联比初始状态更伤我的大脑。我得到了一个关于内部函数的undef,可能会检查那些被定义和导入的函数,在调用它们的时候也准备好了。这太可怕了。为什么是这样写的?我不知道你能这么做。。。创建函数时,将解析使用函数构造函数创建的函数对象。这比在代码中声明函数并调用它效率低,因为使用function语句声明的函数将与其余代码一起解析。-使用“with”是不好的做法。实际上会导致性能下降。谢谢!这实际上推动了事情的发展。就像我说的,JS不是我的强项。脚本现在已经完成了,但仍然会抛出一个错误。它正在从Amazon获取返回的结果,但现在错误显示没有定义amzJSONCallback。我实际上可以看到返回的结果。我会发布整个脚本,但它有390行长。我只是添加了脚本的固定版本。我发誓我以前遇到过amzJSONCallback未定义错误,但我不记得我是如何修复它的。看起来你在和一个JSONP接口说话,你把这个函数名作为回调发送给它。这意味着需要有一个具有该名称的全局函数。如果您将该声明包装在jQuery就绪处理程序中,那么它将不会是全局的。尝试将定义更改为window.amzJSONCallback=。。。看看这是否有帮助。哈利路亚你做到了@Pointy!这个jQuery就绪处理程序是问题的根源。Drupal7似乎需要它,但当我添加它时,它改变了脚本的工作方式。我对PHP没有问题,但我仍然需要学习太多关于JS的知识。再次感谢。
(function($) {
var typedText;
var strSearch = /asin:/;
var srchASIN;
   $(document).ready(function() {
      $("#edit-field-game-title-und-0-asin").change(function() {
         typedText = $("#edit-field-game-title-und-0-asin").val();
         $.ajax({
            type: 'POST',
            data: {typedText: typedText},
            dataType: 'text',
            url: '/asin/autocomplete/',
            success:function(){
               document.getElementById('asin-lookup').style.display='none';
               x = typedText.search(strSearch);
               y = (x+5);
               srchASIN = typedText.substr(y,10)
               amazonSearch();
            }
         });
      });  

      $("#search_asin").click(function() {
         $("#edit-field-game-title-und-0-asin").val('');
         document.getElementById('name-lookup').style.display='none';
         $("#edit-field-game-title-und-0-asin").val('');
         $("#edit-title").val('');
         $("#edit-field-subtitle-und-0-value").val('');
         $("#edit-field-game-edition-und-0-value").val('');
         $("#edit-field-release-date-und-0-value-date").val('');
         $("#edit-field-asin-und-0-asin").val('');
         $("#edit-field-ean-und-0-value").val('');
         $("#edit-field-amazon-results-und-0-value").val('');
         $("#edit-body").val('');
         srchASIN = $("#field-asin-enter").val();
         amazonSearch();
      });

      $("#clear_search").click(function() {
         $("#field-asin-enter").val(''); 
         $("#edit-field-game-title-und-0-asin").val('');
         $("#edit-title").val('');
         $("#edit-field-subtitle-und-0-value").val('');
         $("#edit-field-game-edition-und-0-value").val('');
         $("#edit-field-release-date-und-0-value-date").val('');
         $("#edit-field-release-dt2-und-0-value-date").val('');
         $("#edit-field-asin-und-0-asin").val('');
         $("#edit-field-ean-und-0-value").val('');
         $("#edit-field-amazon-results-und-0-value").val('');
         $("#field-amazon-platform").val('');
         $("#field-amazon-esrb").val('');
         $("#edit-body-und-0-value").val('');
         document.getElementById('asin-lookup').style.display='';
         document.getElementById('name-lookup').style.display='';
      });

      function amazonSearch(){
         var ASIN = srchASIN;
         var azScr = cel("script");
         azScr.setAttribute("type", "text/javascript");
         var requestUrl = invokeRequest(ASIN);
         azScr.setAttribute("src", requestUrl);
         document.getElementsByTagName("head").item(0).appendChild(azScr);
      }
   });

var amzJSONCallback = function(tmpData){
   if(tmpData.Item){
      var tmpItem = tmpData.Item;
   }
   $("#edit-title").val(tmpItem.title);
   $("#edit-field-game-edition-und-0-value").val(tmpItem.edition);
   $("#edit-field-release-date-und-0-value-date").val(tmpItem.relesdate);
   $("#edit-field-release-dt2-und-0-value-date").val(tmpItem.relesdate);
   $("#edit-field-asin-und-0-asin").val(tmpItem.asin);
   $("#edit-field-ean-und-0-value").val(tmpItem.ean);
   $("#field-amazon-platform").val(tmpItem.platform);
   $("#field-amazon-publisher").val(tmpItem.publisher);
   $("#field-amazon-esrb").val(tmpItem.esrb); 
};
function ctn(x){ return document.createTextNode(x); }
function cel(x){ return document.createElement(x); }
function addEvent(obj,type,fn){
   if (obj.addEventListener){obj.addEventListener(type,fn,false);}
   else if (obj.attachEvent){obj["e"+type+fn]=fn; obj.attachEvent("on"+type,function(){obj["e"+type+fn]();});}
}

var styleXSL = "http://www.tlthost.net/sites/vglAmazonAsin.xsl";
function invokeRequest(ASIN) {
  cleanASIN = ASIN.replace(/[-' ']/g,'');
  var unsignedUrl = "http://xml-us.amznxslt.com/onca/xml?Service=AWSECommerceService&AssociateTag=theliterarytimes&IdType=ASIN&ItemId="+cleanASIN+"&Operation=ItemLookup&ResponseGroup=Medium,ItemAttributes,OfferFull&Style="+styleXSL+"&ContentType=text/javascript&CallBack=amzJSONCallback";
    var lines = unsignedUrl.split("\n");
    unsignedUrl = "";
    for (var i in lines) { unsignedUrl += lines[i]; }
  // find host and query portions
  var urlregex = new RegExp("^http:\\/\\/(.*)\\/onca\\/xml\\?(.*)$");
  var matches = urlregex.exec(unsignedUrl);
  var host = matches[1].toLowerCase();
  var query = matches[2];
  // split the query into its constituent parts
  var pairs = query.split("&");
  // remove signature if already there
  // remove access key id if already present 
  //  and replace with the one user provided above
  // add timestamp if not already present
  pairs = cleanupRequest(pairs);
  // encode the name and value in each pair
  pairs = encodeNameValuePairs(pairs);
  // sort them and put them back together to get the canonical query string
  pairs.sort();
  var canonicalQuery = pairs.join("&");
  var stringToSign = "GET\n" + host + "\n/onca/xml\n" + canonicalQuery;
  // calculate the signature
  //var secret = getSecretAccessKey();
  var signature = sign(secret, stringToSign);
  // assemble the signed url
  var signedUrl = "http://" + host + "/onca/xml?" + canonicalQuery + "&Signature=" + signature;
  //document.write ("<html><body><pre>REQUEST: "+signedUrl+"</pre></body></html>");
  return signedUrl;
}

function encodeNameValuePairs(pairs) {
  for (var i = 0; i < pairs.length; i++) {
  var name = "";
  var value = "";
  var pair = pairs[i];
  var index = pair.indexOf("=");
  // take care of special cases like "&foo&", "&foo=&" and "&=foo&" 
  if (index == -1) {
    name = pair;
  } else if (index == 0) {
     value = pair;
  } else {
    name = pair.substring(0, index);
    if (index < pair.length - 1) {
      value = pair.substring(index + 1);
    }
  }
    // decode and encode to make sure we undo any incorrect encoding
  name = encodeURIComponent(decodeURIComponent(name));
    value = value.replace(/\+/g, "%20");
  value = encodeURIComponent(decodeURIComponent(value));
  pairs[i] = name + "=" + value;
  }   
  return pairs;
}

function cleanupRequest(pairs) {
  var haveTimestamp = false;
    var haveAwsId = false;
  var nPairs = pairs.length;
  var i = 0;
  while (i < nPairs) {
  var p = pairs[i];
  if (p.search(/^Timestamp=/) != -1) {
    haveTimestamp = true;
  } else if (p.search(/^(AWSAccessKeyId|SubscriptionId)=/) != -1) {
    pairs.splice(i, 1, "AWSAccessKeyId=" + accessKeyId);
      haveAwsId = true;
  } else if (p.search(/^Signature=/) != -1) {
    pairs.splice(i, 1);
    i--;
    nPairs--;
  }
    i++;
  }
  if (!haveTimestamp) {
    pairs.push("Timestamp=" + getNowTimeStamp());
  }
    if (!haveAwsId) {
      pairs.push("AWSAccessKeyId=" + accessKeyId);
    }
    return pairs;
}

function sign(secret, message) {
  var messageBytes = str2binb(message);
  var secretBytes = str2binb(secret);
  if (secretBytes.length > 16) {
    secretBytes = core_sha256(secretBytes, secret.length * chrsz);
  }  
  var ipad = Array(16), opad = Array(16);
  for (var i = 0; i < 16; i++) { 
    ipad[i] = secretBytes[i] ^ 0x36363636;
    opad[i] = secretBytes[i] ^ 0x5C5C5C5C;
  }
  var imsg = ipad.concat(messageBytes);
  var ihash = core_sha256(imsg, 512 + message.length * chrsz);
  var omsg = opad.concat(ihash);
  var ohash = core_sha256(omsg, 512 + 256);   
  var b64hash = binb2b64(ohash);
  var urlhash = encodeURIComponent(b64hash);
  return urlhash;
}

Date.prototype.toISODate = function() {
  function addZero(n) {
   return ( n < 0 || n > 9 ? "" : "0" ) + n;
  }
  var d = this;
  return d.getFullYear() + '-' + 
    addZero(d.getMonth() + 1) + '-' +
    addZero(d.getDate()) + 'T' +
    addZero(d.getHours()) + ':' +
    addZero(d.getMinutes()) + ':' +
    addZero(d.getSeconds()) + '.000Z';
};

  function getNowTimeStamp() {
      var time = new Date();
      var gmtTime = new Date(time.getTime() + (time.getTimezoneOffset() * 60000));
      return gmtTime.toISODate() ;
  }
}(jQuery));
Date.prototype.toISODate = function() {
  function addZero(n) {
   return ( n < 0 || n > 9 ? "" : "0" ) + n;
  }
  var d = this;
  return d.getFullYear() + '-' + 
    addZero(d.getMonth() + 1) + '-' +
    addZero(d.getDate()) + 'T' +
    addZero(d.getHours()) + ':' +
    addZero(d.getMinutes()) + ':' +
    addZero(d.getSeconds()) + '.000Z';
};