인라인 자바 스크립트 (HTML)는 어떻게 작동합니까?


129

나는 이것이 나쁜 습관이라는 것을 알고 있습니다. 가능하면 이와 같은 코드를 작성하지 마십시오.

물론 인라인 Javascript의 영리한 스 니펫이 문제를 신속하게 해결할 수있는 상황에서는 항상 자신을 찾을 수 있습니다.

이와 같은 내용을 작성할 때 발생하는 일 (및 잠재적 인 함정)을 완전히 이해하기 위해이 쿼리를 추구하고 있습니다.

<a href="#" onclick="alert('Hi')">Click Me</a>

내가 말할 수있는 한 이것은 기능적으로 동일합니다.

<script type="text/javascript">
   $(function(){ // I use jQuery in this example
       document.getElementById('click_me').onclick = 
           function () { alert('Hi'); };
   });
</script>
<a href="#" id="click_me">Click Me</a>

이것으로부터 외삽하면 attribute에 지정된 문자열 onclick이 요소의 클릭 핸들러에 지정된 익명 함수 내에 삽입되는 것 같습니다 . 이것이 사실입니까?

다음과 같은 일을 시작하기 때문에 :

<a href="#" onclick="$(this).next().fadeIn(); return false;">Display my next sibling</a> <!-- Return false in handler so as not to scroll to top of page! --> 

어느 것이 효과가 있습니까? 그러나 나는 이것이 얼마나 해킹인지 모른다. 반환되는 명백한 기능이 없기 때문에 의심스러워 보입니다!

왜 이런 짓을 하겠니, 스티브? 인라인 JS는 나쁜 습관입니다!

솔직히 말하면 페이지의 한 섹션을 수정하기 위해 세 가지 코드 섹션을 편집하는 데 지쳤습니다. 특히 어떤 것이 프로토 타입을 만들 때 전혀 효과가 없는지 알 수 있습니다. 이 HTML 요소와 관련이있는 코드를 요소 에서 바로 정의하는 것이 훨씬 더 쉽고 때로는 의미가 있습니다 . ) 페이지의 나머지 부분에 신비한 JS 및 CSS 크래프트가 걸려 렌더링 속도가 약간 느려집니다. 이것은 참조의 지역성 개념과 비슷하지만 캐시 미스 대신 버그와 코드 팽창을 살펴보고 있습니다.


3
당신은 맞습니다, 그것은 익명의 기능입니다.
bhamlin

1
#click_meDOMready 이벤트에 대한 쿼리를 연결 하거나 스크립트를 노드 뒤에 배치해야합니다.
Bergi

1
콘솔에서을 수행하십시오 document.getElementById("click_me").onclick;. 또는 경고하십시오. 기능에 있음을 알 수 있습니다.
D. Strout

답변:


96

거의 정확하지만 this인라인 코드에 제공된 값을 설명하지 않았습니다 .

<a href="#" onclick="alert(this)">Click Me</a>

실제로 더 가깝습니다.

<a href="#" id="click_me">Click Me</a>
<script type="text/javascript">
document.getElementById('click_me').addEventListener("click", function(event) {
    (function(event) {
        alert(this);
    }).call(document.getElementById('click_me'), event);
});
</script>

인라인 이벤트 핸들러 this는 이벤트 대상과 동일하게 설정 됩니다. 인라인 스크립트에서 익명 함수를 사용할 수도 있습니다

<a href="#" onclick="(function(){alert(this);})()">Click Me</a>

7
스크립트는 태그 뒤에 와야합니다. 그렇지 않으면 태그가 실행될 때 존재하지 않습니다.이를 반영하도록 답변을 변경하는 것이 좋습니다.
undefined

event인라인으로 어떻게 전파합니까 onclick='myFunction(event)'?
oldboy

9

가지고있을 때 브라우저가하는 일

<a onclick="alert('Hi');" ... >

"onclick"의 실제 값을 다음과 같이 효과적으로 설정하는 것입니다.

new Function("event", "alert('Hi');");

즉, "이벤트"매개 변수를 예상하는 함수를 만듭니다. (IE는 그렇지 않습니다. 단순한 단순 익명 함수와 비슷합니다.)


2
아 따라서 실제로 변수 event를 사용하여 event.target인라인 JS 스 니펫에서 이벤트 (및 통해 원래 요소를 통해 ) 를 검색 할 수 있습니다 ! 멋있는.
Steven Lu

1
IE는 실제로 event매개 변수를 전달하지 않지만 event이 익명 함수 내에서 사용하면 IE는이를 실제 이벤트 객체로 이해합니다. 익명 함수가 windowIE에서 객체 의 속성으로 설정 되면이를로 표시합니다 window.event.
rdleal

8

이벤트 핸들러 속성에 대해 많은 나쁜 습관 이 발생 하는 것 같습니다 . 나쁜 관행은 가장 적절한 곳에서 사용 가능한 기능을 알고 사용하지 않습니다. 이벤트 속성은 완전한 W3C 문서화 표준이며 이에 대한 나쁜 관행은 없습니다. W3C 문서화되어 있으며 시간에 유용 할 수있는 인라인 스타일을 배치하는 것과 다르지 않습니다. 스크립트 태그로 묶었는지 여부에 관계없이 동일한 방식으로 해석됩니다.

https://www.w3.org/TR/html5/webappapis.html#event-handler-idl-attributes


2
예, 동의하는 경향이 있으며 특정 상황에서 인라인 코드의 이러한 특정 사용이 정당화 될 수있는 합리적인 "이유"도 제공했습니다. 그러나 실제로는 응용 프로그램 (웹 응용 프로그램 또는 기타)이 특정 복잡성이 될 때 (그리고 일반적으로 많은 시간이 걸리거나 도달하지도 않음) HTML 레이아웃 에 대해 약간의 코드 스 니펫 이 발생할 가능성이 있습니다. 유지 관리 측면에서 건축 적으로 부적절합니다. 예를 들어, HTML 파일 내에서 JS를 직접 코딩하기 시작함으로써 스파게티의 미끄러운 기울기를 유혹하고 있습니다.
Steven Lu

1
그리고 그것은 내가 동의하는 것에 대한 올바른 정당한 주장입니다. 나는 일반적으로 인라인 스크립팅을 추가하거나 해당 교인을 위해 스타일을 추가하지 않습니다. 그러나 사람들은 다른 취향을 가지고 있습니다. 예를 들어 본문 섹션에 스크립트 및 스타일 태그를 추가하는 것을 좋아하는 많은 사람들이 그것을 견딜 수 없습니다. 그러나 그것은 유효하고 어떤 사람들은 그것을 좋아합니다. 이음새 bad practice/spaghettificationgood practice/structure다른 사람들을위한 것입니다.
Daniel B

나는 github.com/styled-components/styled-components살펴 보았고 이것을 반응과 결합하면 예를 들어 앱의 구성 요소와 관련된 모든 것이 실제로 한곳에서 함께 (희망스럽게 평화롭게) 살고 있습니다. 그리고 실제로 끔찍해 보이지도 않습니다. 진보하는 느낌. 이 관점에서 인라인 스타일과 코드를 HTML로 방해하는 것은 올바른 방법이 아닙니다 (지금까지는 HTML과 스타일을 JS 코드로 방해하는 것 같습니다).
Steven Lu

5

질문에 대답하는 가장 좋은 방법 실제 질문을 보는 것입니다.

<a id="test" onclick="alert('test')"> test </a> 

js에서

var test = document.getElementById('test');
console.log( test.onclick ); 

에서 보듯 console이 크롬을 사용하는 경우 IE에서는 약간 다르지만 전달 된 이벤트 객체와 함께 익명 함수를 인쇄합니다.

function onclick(event) {
   alert('test')
}

인라인 이벤트 핸들러에 대한 귀하의 의견에 동의합니다. 예, 작성하기는 쉽지만 여러 위치에서 코드를 변경해야한다는 요점에 동의하지 않습니다. 코드를 잘 구성하면이 작업을 수행 할 필요가 없습니다.


<button onclick="login()"> test login </button>프로토 타이핑에는 어떤 것이 완벽 하다고 생각합니다 . 지금 사용자 상호 작용이 필요한 것을 테스트하고 싶고 나중에 나중에 삭제하려고합니다. 왜 모든 장소에 추가 코드를 작성해야합니까?
Dagg Nabbit

추가 코드가 아니라 익명의 추가 기능입니다. 그리고 그것은 모든 곳이 아니라 실제로는 스크립트 태그에서 한곳에 있습니다.
aziz punjani

"코드를 잘 구성하는 것"과 동일한 아이디어를 공유하고 있는지 잘 모르겠습니다. 핵심 기능이 실제로있는 곳에서 UI를 "핵심 기능"에 바인딩하면 UI에서 바인딩하는 것보다 더 나쁜 커플 링 배열처럼 보입니다. ... 나는 보통 물건 핵심 재료 분리 바인딩 모든 UI를 유지하고, 나는 느낌 OP는 수도가
Dagg Nabbit

3

반환되는 명백한 기능이 없기 때문에 의심스러워 보입니다!

객체의 click 이벤트에 첨부 된 익명 함수입니다.

왜 이러는거야, 스티브?

왜 지구상에서 당신은 doi ..... 아시다시피, 당신이 언급했듯이, 그것은 실제로 널리 나쁜 연습을 채택합니다 :)


3

콘솔에서 이것을 시도하십시오 :

var div = document.createElement('div');

div.setAttribute('onclick', 'alert(event)');

div.onclick

Chrome에서는 다음과 같이 표시됩니다.

function onclick(event) {
  alert(event)
}

...의 비표준 name속성은 div.onclick입니다 "onclick".

따라서 이것이 익명인지 아닌지는 귀하의 "익명"에 대한 정의에 달려 있습니다. 빈 문자열이있는 var foo = new Function()곳 과 비교하고 다음과 같은 것을 생성합니다.foo.namefoo.toString()

function anonymous() {

}

이것은 Pointy의 답변에 대한 주석으로 시작되었지만 실제로는 주석으로 작동하지 않았습니다. 그의 생각이 여기에 가장 좋은 답이라고 생각합니다.
Dagg Nabbit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.