V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
tbag781623489
V2EX  ›  JavaScript

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

  •  
  •   tbag781623489 · 2017-06-23 22:12:20 +08:00 · 5695 次点击
    这是一个创建于 2711 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人新手,最近在写一个 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 大家都懂的就不说了

    7 条回复    2017-06-28 09:28:51 +08:00
    tbag781623489
        1
    tbag781623489  
    OP
       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
        2
    vincentxu  
       2017-06-23 23:11:16 +08:00 via iPhone
    在最顶层绑定一个 error 事件就可以了,没必要重新绑定
    tbag781623489
        3
    tbag781623489  
    OP
       2017-06-24 12:16:05 +08:00
    @vincentxu 有点不懂,dalao 可否举例说说?
    autoxbc
        4
    autoxbc  
       2017-06-27 06:20:13 +08:00
    @tbag781623489 我在 dmm 的页面里看到了这样的代码,不知道题主为什么要用字符串拼接 url,为什么要用 onerror 去试文件是否存在。简单的在 iframe 里读取 json,推送到父窗口生成 video 标签就可以了。
    https://gist.github.com/anonymous/ce1c3bfe8e8b86a0fd849844953c361c
    tbag781623489
        5
    tbag781623489  
    OP
       2017-06-27 17:49:25 +08:00
    @autoxbc 咦,看起来不错,这不用日本 ip 就能获取吗? 我自己用的是新加坡的
    autoxbc
        6
    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
        7
    tbag781623489  
    OP
       2017-06-28 09:28:51 +08:00 via iPhone
    @autoxbc 感谢回复 实际上我上 stack 搜到了个自循环函数自己改了下 现在看起来优雅多了 gayhub 上 commit 那里能搜到
    用这种方式主要是想方便自己有多个 proxy 日本的流量只有 15g 现在对水印无比痛恨 想自己买个 dmm 但又听说有的只卖 dvd。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3339 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 12:28 · PVG 20:28 · LAX 04:28 · JFK 07:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.