Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Android中的webview 加载seajs时 document.URL取到了js路径 导致113行dirname方法中的path为null #1225

Closed
awp405476333 opened this issue Jun 3, 2014 · 15 comments
Milestone

Comments

@awp405476333
Copy link

异常信息:Cannot read property '0' of null 对应的代码在 113行
return path.match(DIRNAME_RE)[0];
然后导致 后面再调用seajs.config时 出现 object has no method 'config'
因为是在手机端使用的 所以 问题可能无法重现。 之后我用日志跟踪调试之后 发现出现该问题时 document.URL(在113行 输出了 doc.URL) 输出的是异步加载进去的seajs.js的路径 而在正常运行时 输出的是 当前网页的路径 。
另外没太看懂 为何在254行 要用
var doc = document
var cwd = dirname(doc.URL)
这个方式获取路径,而不用window.location.href?
现在不确定是否是由于webview加载顺序的问题 还是什么原因?
有人遇到过么?

@army8735
Copy link
Member

army8735 commented Jun 3, 2014

这个在ie本地下也会有错,曾经是location,后来改URL是为了更短,再后来又改回来了,但还没发布。你可以自己先改回来。

@awp405476333
Copy link
Author

是把var cwd = dirname(doc.URL) 改为var cwd = dirname(doc.location.href);?
这样也还是会出现上面提到的 “Cannot read property '0' of null” 的问题。 还有其他的解决方案么?
另外 输出的
path 为 about:blank
window.location.href 也是 about:blank;

@army8735
Copy link
Member

army8735 commented Jun 3, 2014

window.location.href 也是 about:blank;

看来空白页,新标签页之类的这个正则会出错,目前只有webview这样的容器会有了?

@awp405476333
Copy link
Author

目前我只在 android 的webview上发现这个问题了 而且偶尔会正常运行。 机型是 红米
同样的js 在ios端的 webview 上是正常的。
这个地方 能否把 var cwd = dirname(doc.URL) 这句 改为变量赋值呢?
比如 我先写一个全局变量 x 然后 var cwd =dirname(doc.URL||x);

@army8735
Copy link
Member

army8735 commented Jun 3, 2014

这样改不生效,doc.URI为'about:blank'还是会报错。

var cwd = (!location.href || location.href.indexOf('about:') === 0) ? '' : dirname(location.href)

@awp405476333
Copy link
Author

嗯 不好意思哈 刚才出去了一趟 没及时看到
上面那个改法 是在测试中发现,当
window.location.href为 about:blank 时
doc.URL为空字符串
然后 下面你给出的这段代码 把cwd置为空字符串 不会有影响么?

@awp405476333
Copy link
Author

可以解决了
现在不会出现 Cannot read property '0' of null 的问题了。。
谢谢玉伯大神
不过 现在提示跨域了 =。=! 。
在899行
SECURITY_ERR: DOM Exception 18
然后导致 object has no method 。。

@afc163
Copy link
Member

afc163 commented Jun 3, 2014

谢谢玉伯大神

。。。。。

@army8735
Copy link
Member

army8735 commented Jun 3, 2014

cwd在解析相对域名(./和/)以及seajs.use时使用,use可以忽略,在当前页面上解析相对域名,页面肯定有url。
about:blank的情况有点怪。

哇哈哈哈哈,我是玉伯的小号~~~

@gyf19
Copy link

gyf19 commented Jun 3, 2014

玉伯的马甲??

@army8735
Copy link
Member

army8735 commented Jun 3, 2014

DOM Exception 18
是你自己的应用里的问题了吧,这个无能为力了。

@awp405476333
Copy link
Author

嗯 好的 非常感谢 。我自己再研究一下。。。
欸 坑爹的bug。。。

footearth added a commit to Mooxe000/seajs that referenced this issue Jun 3, 2014
set cwd to an empty string if locatoin.href is unusual seajs#1225
@awp405476333
Copy link
Author

问题已修复了。 跨域问题似乎是由于我在添加js前有一个不同域的跳转。
就是如下情景
希望跳转页面B 并在B页面加载完成后异步加载seajs
实际的过程是:
跳转中间页A -->然后 A跳转B (由服务端跳转的 C#的Response.Redirect跳转)
并且 seajs 在A页面执行完成后 就加载了。(A,B 不同域)
这时跳转了B页面 就出现了跨域问题。
解决方案:去掉了中间页跳转
没有解决和搞明白 本质问题。按道理说 页面跳转了 js应该不会驻留?

@army8735
Copy link
Member

army8735 commented Jun 3, 2014

跳转不驻留的

@awp405476333
Copy link
Author

确实应该不驻留
但是现在情况就是
在请求页面A结束时 加载seajs 出现跨域错误
然后第二次错误请求B页面结束时 又加载seajs 出现错误 object has no method 'config'

@army8735 army8735 added this to the 2.3.0 milestone Jun 10, 2014
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants