2014-10-22 6 views
0

Polymer를 사용하는 웹 응용 프로그램에서 javascript 함수 dispatchEvent를 사용하여 문제가 발생했습니다. 내 코드는 크롬에서 잘 실행하지만, 파이어 폭스 (V31과 V33), 나는 다음과 같은 오류가 나타납니다 여기에 Polymer를 사용하여 dispatchEvent를 사용하는 데 문제가 있습니다.

TypeError: Argument 1 of EventTarget.dispatchEvent does not implement interface Event. 

오류 생성하는 코드입니다 : 또는

button.dispatchEvent(new CustomEvent('chosen', {'detail': value})); 

을, 나 또한 노력 :

var event = new Event('chosen'); 
event.detail = value; 
button.dispatchEvent(event); 

결과는 동일 :이 코드는 크롬에서 잘 작동하지만,이 dispatchEvent에 도달 할 때이 같은 오류 메시지와 함께 실행을 중단.

저는이 코드가 Firefox에서 작동해야한다고 확신합니다 (https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events 참조). 실제로이 코드는 Firefox의 비 폴리머 시나리오에서 잘 작동합니다. (즉, 폴리머 가져 오기/스크립트를 사용하지 않고 어떤 방식 으로든 이벤트를 생성하고 파견하는 경우 정상적으로 작동합니다.)

가장 좋은 추측은 Polymer 프레임 워크 (platform.js 또는 polymer)에있는 것입니다. js)는 이벤트 주변의 내장 함수를 재정의합니다. (0.3.4 버전을 사용 중입니다.)

나는 광범위하게 검색해 봤지만 완전히 동일한 문제가있는 사람을 찾을 수 없었습니다. 동일한 오류 메시지가있는 사람들을 찾았지만 다른 소프트웨어 (예 : Selenium)를 사용하여보고했습니다.

Polymer는 전통적인 이벤트 전달을 둘러싼 래퍼 인 "fire"메서드를 제공하므로 사용 방법을 살펴 보겠습니다. 그러나, 나는 StackOverflow 커뮤니티에 누군가가 어떤 생각을했는지 알기 위해 손을 뻗을 것이라고 생각했습니다.

미리 감사드립니다.

----------- 후속 ------------ 쓴 사람들. 그것을 점점 더 운이 지금까지 작동하지에 대한

감사합니다, 그러나 나는 그 문제를 보여주는 간단한 repro를 만들었다. 여기 내 HTML 파일에 대한 코드가 있습니다.

<!DOCTYPE html> 
 
<html> 
 
    <head> 
 
    <script src="http://www.polymer-project.org/components/platform/platform.js"></script> 
 

 
    <link rel="import" href="http://www.polymer-project.org/components/font-roboto/roboto.html"/> 
 
    <link rel="import" href="http://www.polymer-project.org/components/paper-button/paper-button.html"/> 
 

 
    <style> 
 
     body { 
 
     font-family: RobotoDraft, 'Helvetica Neue', Helvetica, Arial; 
 
     text-align: left; 
 
     } 
 
    </style> 
 
    <script type="text/javascript"> 
 
     function buttonClicked(button) 
 
     { 
 
     alert("Button clicked: " + button); 
 
     alert("Firing custom event foo"); 
 
     try { 
 
      // button.dispatchEvent(new CustomEvent('foo')); 
 
      button.fire('foo'); 
 
      alert("Foo fired successfully."); 
 
     } catch (err) { 
 
      alert("Fire event failed."); 
 
      alert(err); 
 
     }   
 
     } 
 
    </script> 
 
    </head> 
 
    <body> 
 
    <paper-button onclick="buttonClicked(this);">Click</paper-button> 
 
    </body> 
 
</html>

에 관계없이 나는 button.fire 또는 button.dispatchEvent 사용 여부, 코드는 크롬에 성공하고 파이어 폭스에 실패합니다.

크롬 결과 (중 코드 라인은) : 버튼을 클릭 : [객체는 HTMLElement] try_button_event.html : 18 발사 사용자 정의 이벤트가 foo는 try_button_event.html : 19 푸 성공적으로 발사했다.

파이어 폭스 결과 (button.fire는) : 버튼을 클릭 : [객체는 HTMLElement] 화재 이벤트가 실패 사용자 지정 이벤트 foo는 발사. 형식 오류 : button.fire 함수

파이어 폭스 결과 (button.dispatchEvent)되지 않습니다 : 버튼을 클릭 : [객체는 HTMLElement] 사용자 정의 이벤트 foo는 화재 사건을 발사 실패했습니다. TypeError : EventTarget.dispatchEvent의 인수 1이 interface Event를 구현하지 않습니다.

+0

'버튼'이란 무엇입니까? 종이 단추 요소? –

+0

좋은 질문입니다. 예, 버튼은 <종이 버튼>입니다. 나는 원래 그것을 분명히 했어야했는데, 이것이 모든 요소에서 일어난다 고 생각했다. 더 자세히 살펴보면 dispatchEvent를 호출 할 요소의 유형이 중요합니다. elem이 일반 바닐라 div 인 경우 또는 작성하는 사용자 정의 (폴리머) 요소 인 경우 elem.dispatchEvent (new Event())는 올바르게 작동합니다. 그래서 이것은 (그리고 아마도 다른 종이 요소들)에 특별한 것 같습니다. – mikepr

답변

1

onclick을 사용하면 ShadowDOM 폴리 폴리이 단추를 관리하지 못하게 할 수 있습니다.

당신은과 같이 클릭 방법 내부 button 참조를 포장 에 의해

function buttonClicked(button) 
    { 
    button = wrap(button); 

를 고칠 수 있지만 일반적으로 인라인 이벤트 핸들러를 피하는 것이 더 낫다. 귀하의 예를 들어 보겠습니다 :

<!DOCTYPE html> 
<html> 
    <head> 
    <script src="http://www.polymer-project.org/components/platform/platform.js"></script> 

    <link rel="import" href="http://www.polymer-project.org/components/font-roboto/roboto.html"/> 
    <link rel="import" href="http://www.polymer-project.org/components/paper-button/paper-button.html"/> 

    <style> 
     body { 
     font-family: RobotoDraft, 'Helvetica Neue', Helvetica, Arial; 
     text-align: left; 
     } 
    </style> 
    </head> 
    <body> 

    <paper-button>Click</paper-button> 

    <script type="text/javascript"> 
     document.querySelector('paper-button').addEventListener('click', buttonClicked); 
     function buttonClicked() 
     { 
     alert("Button clicked: " + this); 
     alert("Firing custom event foo"); 
     try { 
      // button.dispatchEvent(new CustomEvent('foo')); 
      this.fire('foo'); 
      alert("Foo fired successfully."); 
     } catch (err) { 
      alert("Fire event failed."); 
      alert(err); 
     }   
     } 
    </script> 
    </body> 
</html> 
+0

고마워요! 포장은 완벽하게 작동했습니다. 귀하의 응답에서이 방법으로 wrap()을 사용하는 것이 선호하는 방법이 아니기 때문에 수집합니다. 이벤트 처리기를 연결하는 선언적 방법 (예 : 클릭 대 Onclick)이 있습니까? 프로그래밍 방식으로 이벤트 리스너를 연결하면 불필요한 복잡성이 추가되는 것 같습니다. 도와 주셔서 다시 한 번 감사드립니다! – mikepr

+0

브라우저 공급 업체는 명령 리스너 ('addEventListener')를 첨부하기 위해 명령형 코드를 사용하기를 원합니다.'on '구문은 일반적으로 유해한 것으로 간주됩니다. Polymer의'on- '구문은 속성에 코드를 넣지 않고 처리기의 이름 만 사용하기 때문에 다르지만 Polymer 템플릿을 사용하여이 지원을 옵트 아웃해야합니다. 전체 요소를 사용하지 않으려면 자동 바인딩 템플릿 (https://www.polymer-project.org/docs/polymer/databinding-advanced.html#bindingoutside)을 사용하십시오. –

0

개체가 아닌 창에서 이벤트를 보내도록 시도 할 수 있습니다. http://jsfiddle.net/95budad2/

window.dispatchEvent(new CustomEvent('chosen', {'detail': 'test'})); 
+0

흠, 나는 그것을 할 수 있을지도 모른다. 이 특별한 경우에, 내 자신 만의 custom 요소 (이라고 부름)는 다수의 을 포함하고 있으며, 버튼을 부모 객체. 이벤트를 수신 대기합니다. 따라서 최상위 수준의 문서로 올리면 작동하지 않을 수도 있지만 버튼의 조상이 올릴 수 있습니다. 나는 조사 할 것이다. – mikepr

0

나는 당신을 위해 즉시 문제를 해결하기 위해 button.fire(event)를 사용하는 것이 좋습니다 것입니다.

Polymer의 최신 버전으로 코드를 시험해보고 dispatchEvent에서 예외가 발생하면 간단한 jsbin 복제로 종이 단추 github 프로젝트에 문제를 제기하는 것이 좋습니다.

+0

감사합니다. 사실 button.fire를 호출하려고 할 때 화재가 함수가 아니라는 오류가 발생합니다. (이것은 또한 파이어 폭스에서만 발생합니다 - 크롬에서는 잘 작동합니다.) 또한 Polymer 4.2로 업그레이드를 시도했습니다. 종이 단추로 맨손으로 재생산을 시도해 보겠습니다. 문제가 계속된다면 버그를 제안하고 제기 할 때해야 할 일입니다. – mikepr

+0

어쩌면 파이어 폭스에서 다른 요소 객체로 끝나는 것일까 요? 또는 폴리머 준비가 아직 시작되지 않았습니까? 당신이 함께 할 시간이 있다면 재생산을 보는 것에 관심이 있습니다. –

+0

원본 게시물을 편집하여 복제본을 포함 시켰습니다. – mikepr

관련 문제