IE 11 angular 范围 return 函数而不是 object
IE 11 angular scope return function instead of object
$scope.updateCart = function() {
item = $scope.productData;
此代码片段 returns 是 IE 11 中的一个函数,而不是像 chrome
上那样 object
导致下面的$http请求发送乱码数据。
使用https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js
上一个标题:IE 11 jquery 'Argument not optional' 错误
以下代码:
dt = $.param({
shopid: shop_id,
mtd: method,
item: item
});
抛出以下错误:
TypeError: Argument not optional
at add (https://code.jquery.com/jquery-1.9.1.js:7340:4)
at buildParams (https://code.jquery.com/jquery-1.9.1.js:7392:3)
at jQuery.param (https://code.jquery.com/jquery-1.9.1.js:7360:4)
at $scope.updateBACart (http://127.0.0.1:6636/js/baCartNg.js?v=1478430971:104:3)
at fn (Function code:2:216)
at expensiveCheckFn (http://code.angularjs.org/1.5.5/angular.js:15485:11)
at callback (http://code.angularjs.org/1.5.5/angular.js:25018:17)
at Scope.prototype.$eval (http://code.angularjs.org/1.5.5/angular.js:17229:9)
at Scope.prototype.$apply (http://code.angularjs.org/1.5.5/angular.js:17329:13)
at Anonymous function (http://code.angularjs.org/1.5.5/angular.js:25023:17)
错误在 IE 11 中抛出,但在 chrome
中没有
根据https://docs.angularjs.org/api/ng/service/$httpParamSerializerJQLike
我更改代码:
dt = $httpParamSerializerJQLike({
shopid: shop_id,
mtd: method,
item: item
});
现在代码不会抛出错误,但请求是
item: %0Afunction+item()+%7B%0A++++%5Bnative+code%5D%0A%7D%0A
mtd: add
shopid: 1
而不是项目数据。
解决方案是item1 = $scope.productData;
而不是item = $scope.productData;
出于某种原因,IE11 将 item
设置为 function item() { [native code] }
当然,你可以将你的变量命名为 item1
而不是 item
并且现在可以使用......但这并没有告诉你什么是 错误 用你的原始代码。
真正的问题是您分配给全局变量而不是局部变量。当您使用:
function () {
item = (2 + 2); // or some other value
}
之前没有使用 var item
,您实际上是在分配给 全局 变量 item
。在浏览器上下文中,全局作用域是 window
对象,所以上面等价于:
function () {
window.item = (2 + 2);
}
在 Chrome 中没有问题:最初没有 window.item
,所以这个赋值创建了它。然而在 IE11 中,window
已经有一个 item
属性,而且它是 只读 !这意味着对全局 item
变量的所有赋值都被静默忽略,因此 window.item
始终具有其原始函数值。
您的 "solution" 通过使用不同的变量名来解决这个问题。更好、更健壮和更有效的解决方案是使用 locally scoped 变量代替:
function () {
var item = (2 + 2); // does NOT create a global item variable
}
作为一个好习惯,请确保在声明新变量时始终使用var
,以避免意外创建全局变量。更好的是,在你的函数中添加一个 "use strict"
指令,这样这些类型的赋值就会抛出错误,而不是默默地忽略错误。
如果你真的需要创建一个全局变量,显式地分配给 window
对象本身的 属性:
function () {
window.globalItem = (2 + 2);
}
$scope.updateCart = function() {
item = $scope.productData;
此代码片段 returns 是 IE 11 中的一个函数,而不是像 chrome
上那样 object导致下面的$http请求发送乱码数据。
使用https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js
上一个标题:IE 11 jquery 'Argument not optional' 错误
以下代码:
dt = $.param({
shopid: shop_id,
mtd: method,
item: item
});
抛出以下错误:
TypeError: Argument not optional
at add (https://code.jquery.com/jquery-1.9.1.js:7340:4)
at buildParams (https://code.jquery.com/jquery-1.9.1.js:7392:3)
at jQuery.param (https://code.jquery.com/jquery-1.9.1.js:7360:4)
at $scope.updateBACart (http://127.0.0.1:6636/js/baCartNg.js?v=1478430971:104:3)
at fn (Function code:2:216)
at expensiveCheckFn (http://code.angularjs.org/1.5.5/angular.js:15485:11)
at callback (http://code.angularjs.org/1.5.5/angular.js:25018:17)
at Scope.prototype.$eval (http://code.angularjs.org/1.5.5/angular.js:17229:9)
at Scope.prototype.$apply (http://code.angularjs.org/1.5.5/angular.js:17329:13)
at Anonymous function (http://code.angularjs.org/1.5.5/angular.js:25023:17)
错误在 IE 11 中抛出,但在 chrome
中没有根据https://docs.angularjs.org/api/ng/service/$httpParamSerializerJQLike
我更改代码:
dt = $httpParamSerializerJQLike({
shopid: shop_id,
mtd: method,
item: item
});
现在代码不会抛出错误,但请求是
item: %0Afunction+item()+%7B%0A++++%5Bnative+code%5D%0A%7D%0A
mtd: add
shopid: 1
而不是项目数据。
解决方案是item1 = $scope.productData;
而不是item = $scope.productData;
出于某种原因,IE11 将 item
设置为 function item() { [native code] }
当然,你可以将你的变量命名为 item1
而不是 item
并且现在可以使用......但这并没有告诉你什么是 错误 用你的原始代码。
真正的问题是您分配给全局变量而不是局部变量。当您使用:
function () {
item = (2 + 2); // or some other value
}
之前没有使用 var item
,您实际上是在分配给 全局 变量 item
。在浏览器上下文中,全局作用域是 window
对象,所以上面等价于:
function () {
window.item = (2 + 2);
}
在 Chrome 中没有问题:最初没有 window.item
,所以这个赋值创建了它。然而在 IE11 中,window
已经有一个 item
属性,而且它是 只读 !这意味着对全局 item
变量的所有赋值都被静默忽略,因此 window.item
始终具有其原始函数值。
您的 "solution" 通过使用不同的变量名来解决这个问题。更好、更健壮和更有效的解决方案是使用 locally scoped 变量代替:
function () {
var item = (2 + 2); // does NOT create a global item variable
}
作为一个好习惯,请确保在声明新变量时始终使用var
,以避免意外创建全局变量。更好的是,在你的函数中添加一个 "use strict"
指令,这样这些类型的赋值就会抛出错误,而不是默默地忽略错误。
如果你真的需要创建一个全局变量,显式地分配给 window
对象本身的 属性:
function () {
window.globalItem = (2 + 2);
}