我正在尝试执行URLSearchParams,但因为IE 11不支持它而出现错误。 它在Chrome和Firefox中工作得很好。
如何在IE 11中获得相同的功能? 我正在Laravel 5.4中执行代码。
这是我正在尝试执行的代码行:
var urlParams = new URLSearchParams(window.location.search);
错误:
SCRIPT5009:'URLSearchParams'未定义
我正在尝试执行URLSearchParams,但因为IE 11不支持它而出现错误。 它在Chrome和Firefox中工作得很好。
如何在IE 11中获得相同的功能? 我正在Laravel 5.4中执行代码。
这是我正在尝试执行的代码行:
var urlParams = new URLSearchParams(window.location.search);
错误:
SCRIPT5009:'URLSearchParams'未定义
通过用以下代码替换原有代码解决了问题:
$.urlParam = function(name){
var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href);
if (results == null){
return null;
}
else {
return decodeURI(results[1]) || 0;
}
}
例如,"example.com?param1=name¶m2=&id=6"。
$.urlParam('param1'); // name
$.urlParam('id'); // 6
$.urlParam('param2'); // null
Odhikari的回答作为(部分)polyfill:
(function (w) {
w.URLSearchParams = w.URLSearchParams || function (searchString) {
var self = this;
self.searchString = searchString;
self.get = function (name) {
var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(self.searchString);
if (results == null) {
return null;
}
else {
return decodeURI(results[1]) || 0;
}
};
}
})(window)
decodeURIComponent
而不是decodeURI
是一个更完整的解决方案,我认为。 - ŠtěpánURLSearchParams.append()
),它就不起作用了。 - Brent O'Connorself.has = function(name) { var results = new RegExp('[\?&]' + name).exec(self.searchString); if (results == null) { return null; } else { return true; }}
,你也可以以类似的方式根据需要添加其他方法(如append()
)的支持。 - Rick Gladwin如果有人在2019年看到这篇文章,现在corejs也支持URLSearchParams作为polyfill,所以你可以继续使用corejs而不需要自己编写一些东西。
import 'core-js/features/url-search-params';
:我使用url-search-params-polyfill解决了这个问题。只需将其导入您正在使用URLSearchParams的文件中:
import 'url-search-params-polyfill';
现有的 URLSearchParams 的引用现在应该可以工作了!
let axiosConfig = {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
};
// Putting together the data to be passed to local servlet.
const params = new URLSearchParams();
params.append('var1', this.state.data1);
params.append('var2', this.state.data2);
var urlToPost = 'https://localhost:8080/someLocalServlet/doSomething';
var self = this;
axios.post(urlToPost, params, axiosConfig)
.then((res) => {
// Handling Response from Servlet.
console.log("AXIOS POST RESPONSE RECEIVED: ", res);
})
.catch((err) => {
// Handler exception error thrown by Servlet.
console.log("AXIOS POST ERROR: ", err);
})
if((navigator.userAgent.indexOf("MSIE") !== -1 ) || (!!document.documentMode === true )) { //IF IE > 10
var myObject = {
var1: this.state.data1,
var2: this.state.data2
};
var urlToPostTo = 'https://localhost:8080/someLocalServlet/doSomething';
$.post(urlToPost, myObject,
function(result) {
alert( "success" );
})
.done(function(result) {
alert( "second success" );
})
.fail(function(result) {
alert( "error" );
})
.always(function(result) {
alert( "finished" );
});
} else {
// use the AXIOS POST code above
}
然后,在我的React文件顶部导入以下内容:npm install jquery
import $ from 'jquery';
import { polyfill } from 'es6-promise'; polyfill();
class UrlSearchParams {
constructor(query) {
this.query = query;
}
getSearchObject = () => {
const { query } = this;
return query
? (/^[?#]/.test(query) ? query.slice(1) : query)
.split("&")
.reduce((params, param) => {
let [key, value] = param.split("=");
params[key] = value
? decodeURIComponent(value.replace(/\+/g, " "))
: "";
return params;
}, {})
: {};
};
getAll = () => {
const searchParams = this.getSearchObject();
return searchParams;
}
get = param => {
const searchParams = this.getSearchObject();
return searchParams[param];
};
setUrl = (param, value) => {
const searchParams = this.getSearchObject();
searchParams[param] = value;
return Object.keys(searchParams)
.map(key => key + "=" + searchParams[key])
.join("&");
};
}
export default UrlSearchParams;