无外部页面权限,如何直接调用其JS加载AJAX订单?
解决直接调用AJAX加载订单的问题
首先得说,你之前的代码思路有问题——把javascript:load_order()直接拼在URL后面,浏览器会把整个字符串当成一个不存在的网页地址来访问,自然达不到预期效果。要实现打开外部订单页后自动加载指定订单,得分两种情况来处理:
一、如果你的页面和外部订单页同域
这种情况下浏览器的同源策略不会限制你操作新窗口的JS上下文,可以用以下方法:
步骤1:修改HTML链接,用onclick触发自定义函数
把你原来的PHP输出代码改成这样:
echo '<a target="_blank" onclick="openOrderPageAndLoad(\'' . $ordernr[0] . '\')">' . $tracking_box . '</a>';
步骤2:添加JavaScript函数处理页面加载和调用
在你的页面里加一段JS:
function openOrderPageAndLoad(orderNumber) { // 打开外部订单页面 const orderWindow = window.open('http://www.example.com/orders'); // 轮询检测页面是否加载完成 const loadChecker = setInterval(() => { if (orderWindow.document.readyState === 'complete') { clearInterval(loadChecker); // 调用外部页面的load_order函数 orderWindow.load_order(orderNumber); } }, 100); // 每100毫秒检查一次 }
这个方法的核心是等外部页面完全加载后,再调用它的全局JS函数load_order。
二、如果你的页面和外部订单页不同域
这时候浏览器的同源安全策略会直接阻止你访问新窗口的JS上下文——毕竟浏览器不允许随便跨域操作其他网站的代码,这是安全限制。这种情况下你有几个可选方向:
- 联系外部网站开发者:请求他们支持通过URL参数自动加载订单,比如允许访问
http://www.example.com/orders?order=XYZ时,页面自动执行load_order('XYZ')。这是最靠谱的方案,但需要对方配合。 - 检查外部页面是否支持postMessage:如果对方页面有监听
postMessage的逻辑,你可以在新窗口加载完成后发送订单号消息,让对方页面自己执行load_order。但同样需要对方页面提前做适配,你没有权限修改的话没法实现。 - 退而求其次的手动方案:如果以上都做不到,只能让用户先打开外部订单页,然后手动执行JS(比如让用户复制订单号到控制台执行
load_order('XXX')),但体验肯定不如自动加载。
为什么你之前的代码失效?
你写的href=https://www.example.com/orders/javascript:load_order('$ordernr[0]')是错误的写法——javascript:伪协议应该单独作为href的值,而不是拼在URL后面。但就算写成href="javascript:window.open('http://www.example.com/orders');load_order('XXX')"也没用,因为load_order是外部页面的函数,当前页面根本不存在这个函数,而且新窗口还没加载完成就调用的话也会报错。
内容的提问来源于stack exchange,提问作者GTO
相关产品推荐
相关产品推荐

