请教一个 video 的多个 onerror 的问题

2017-06-23 22:12:20 +08:00
 tbag781623489

本人新手,最近在写一个 user-script。视频 src 不确定,要自己拼接,而且清晰度部分的 src 还挺多花样的,所以我原来打算这样

var Preview = documeng.createElement('video')
Preview.src="http://cc3001.dmm.co.jp/litevideo/freepv/" + arr1[0] + "/" + arr1.slice(0,3).join("") + "/" + lib_pf + "/" + lib_pf + "_dmb_w.mp4";
Preview.onerror=function() {
	Preview.src="http://cc3001.dmm.co.jp/litevideo/freepv/" + arr1[0] + "/" + arr1.slice(0,3).join("") + "/" + lib_pf + "/" + lib_pf + "_dm_w.mp4";
    Preview.onerror=function() {
    	Preview.src="http://cc3001.dmm.co.jp/litevideo/freepv/" + arr1[0] + "/" + arr1.slice(0,3).join("") + "/" + lib_pf + "/" + lib_pf + "_sm_w.mp4";
    	Preview.onerror=function() {
        	//一个接一个的 onerror=function...
        }
    }
}

但是这样感觉非常难看,而且想添加新 url 规则的时候更是艰辛,于是我之后用 function 试了下但是发现在 function 中设置 onerror 似乎不起作用。。请问大家有什么好的建议? Thanks in advance.
dmm 大家都懂的就不说了

5727 次点击
所在节点    JavaScript
7 条回复
tbag781623489
2017-06-23 23:01:04 +08:00
关于 onerror 在 function 似乎不起作用,我个人有点疑惑:比如
```
function set_url(self) {
self.src = 'www.example.com/123'
self.onerror = function() { self.src='www.example.com/456'; console.log('This step was triggered') }
}
video.src = set_url(video)
video.onerror = function() { this.src='www.example.com/789' }
```
上面的 console.log 是不会被执行的,也就是不会有把 url 改成 456 的尝试。请问是为什么呢?
vincentxu
2017-06-23 23:11:16 +08:00
在最顶层绑定一个 error 事件就可以了,没必要重新绑定
tbag781623489
2017-06-24 12:16:05 +08:00
@vincentxu 有点不懂,dalao 可否举例说说?
autoxbc
2017-06-27 06:20:13 +08:00
@tbag781623489 我在 dmm 的页面里看到了这样的代码,不知道题主为什么要用字符串拼接 url,为什么要用 onerror 去试文件是否存在。简单的在 iframe 里读取 json,推送到父窗口生成 video 标签就可以了。
https://gist.github.com/anonymous/ce1c3bfe8e8b86a0fd849844953c361c
tbag781623489
2017-06-27 17:49:25 +08:00
@autoxbc 咦,看起来不错,这不用日本 ip 就能获取吗? 我自己用的是新加坡的
autoxbc
2017-06-27 21:32:07 +08:00
@tbag781623489 不用日本 ip 不能获取,dmm 网页限制 ip,只有最终文件下载不限制。如果是需要用番号直接生成下载链接,那这种方法不行。

看了下一楼的代码,onerror 只能定义一次,多次定义离 error 事件最近的有效。javascript 的异步流程决定了,一楼的实际流程是

src = 123
self.onerror = {...} 此时 http 状态码还没有返回,error 事件不会触发
video.onerror = {...} 回调被覆盖了
... 过了一段时间
src = 123 的 error 触发,执行 src = 789

所以 src = 456 和 log 不会执行
tbag781623489
2017-06-28 09:28:51 +08:00
@autoxbc 感谢回复 实际上我上 stack 搜到了个自循环函数自己改了下 现在看起来优雅多了 gayhub 上 commit 那里能搜到
用这种方式主要是想方便自己有多个 proxy 日本的流量只有 15g 现在对水印无比痛恨 想自己买个 dmm 但又听说有的只卖 dvd。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/370687

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX