最近把原生的页面改成vue,遇到了接口返回一段html字符串,加载这段html的问题。
乍一看,简单呀,用v-html渲染呀~
仔细一看,html里还带script标签,对于一个iOS大(cai)牛(niao)跨界前端的新手来说,这还是挺有挑战的。
脑(bai)瓜(du)一动(xia),思路大概是有个组件里面渲染html,最后提交一下表单。
代码如下:
- template
<template>
<div>
<iframe id="formRequest" :style="{width: 750+'px', height: getPageHeight()+'px'}"></iframe>
</div>
</template>
- script
let document1 = document.getElementById('formRequest').contentWindow.document;
document1.body.innerHTML = this.htmlText; // form 字符串
document1.forms[0].submit();
chrome试一下没问题,开开心心结束。
过了两天,测试说手机上不行哎,查了一查,果然有些form串可以有些form串不行,换种写法,script里改成如下:
let document1 = document.getElementById('formRequest').contentWindow.document;
const div = document1.createElement('div');
div.innerHTML = this.htmlText;
document1.body.appendChild(div);
document1.forms[0].submit();
普非可特~
后记:突然发现交行直连验证的form串用上面的内嵌方式在ios上会有问题,查明原因猜测是因为ios上阻止跨网站跟踪开启导致的,关闭是不可能关闭的,所以需要换实现方式,一番探索下来,在不修改银行form串的前提下,好像并没有什么好的方法。这里暂时的解决方式是,遇到交行直连验证,不内嵌,直接打开交行的验证页面,在前置页面提示用户授权结束后返回继续流程。招行直连内嵌方式会有跨域的问题,同理银行form不能修改,所以解决办法同交行了。
const div = document.createElement('div')
div.innerHTML = this.htmlText
document.body.appendChild(div)
document.forms[0].submit();