내 JavaScript가 JSFiddle에서 작동하지 않는 이유는 무엇입니까?


114

이 JSFiddle 의 문제점을 찾을 수 없습니다 .

HTML :

<input type="button" value="test" onclick="test()">

자바 스크립트 :

function test(){alert("test");}

그리고 버튼을 클릭해도 아무 일도 일어나지 않았습니다. 콘솔에 "테스트가 정의되지 않았습니다"라고 표시됩니다.

JSFiddle 문서를 읽었습니다. 거기에 JS 코드가 추가 <head>되고 HTML 코드가 추가 되었다고합니다 (따라서이 <body>JS 코드는 html보다 이전 버전이므로 작동해야합니다).


괄호를 제거하면 일반적인 비 바이올린 상황에서도 작동하지만 가능한 한 많이 HTML에서 js를 분리하는 것이 좋습니다. 나는 스타일 = "display : none"CSS 인라인 no-no 만 허용합니다.
— Adrian Bartholomew 2012

답변:


60

함수가로드 핸들러 내부에 정의되고 있으므로 다른 범위에 있습니다. @ellisbben이 주석에서 언급했듯이 window객체 에 명시 적으로 정의하여이를 수정할 수 있습니다 . 더 나은 방법은 객체에 처리기를 눈에 띄지 않게 적용하도록 변경하는 것입니다. http://jsfiddle.net/pUeue/

$('input[type=button]').click( function() {
   alert("test");   
});

인라인 대신 이런 방식으로 핸들러를 적용하면 HTML이 깨끗하게 유지됩니다. 저는 jQuery를 사용하고 있지만 원하는 경우 프레임 워크를 사용하거나 사용하지 않고 다른 프레임 워크를 사용할 수 있습니다.


@Innuendo-jsFiddle은 코드 / html / 스타일 시트에 대해 별도의 프레임을 사용합니다. 함수 호출에서 프레임을 참조해야하지만 프레임에 이름이 없기 때문에 그렇게하는 쉬운 방법이 없습니다. jsfiddle이 작동하는 방식 때문에 정말 문제가되지만 자바 스크립트를 완전히 분리하는 것이 좋습니다.
— tvanfosson 2011 년

5
@ tvanfosson- 솔루션은 작동하지만 jsfiddle은 결과를 표시하기 위해 별도의 프레임을 사용하지 않습니다. jsfiddle.net/Yazpj/show를 참조하십시오 . 처음에 작동하지 않는 이유 test는 onLoad함수 내부에 정의되어 있기 때문입니다 . 사용 window.test = function(){/*...*/}하면 완벽하게 잘 작동합니다.
— ellisbben 2011 년

@ellisbben-Firebug를 사용하여 DOM을 검사하면 4 개의 개별 창 각각이 별도의 iframe에 존재합니다.
— tvanfosson 2011 년

1
예,하지만 예제를 보여주기 위해 사용 된 단일 iframe을 살펴보면 프레임을 사용하지 않는 단일 페이지에 모든 코드를 넣는다는 것을 알 수 있습니다. 따라서 이러한 프레임은 예제를 깨뜨릴 수 없습니다. show내가 말하는 내용을 보려면 jsfiddle URL에 추가 하십시오. jsfiddle.net/Yazpj/show
— ellisbben

100

랩 설정을 지정하지 않으면 기본값은 "onLoad"입니다. 결과가로드 된 후 실행되는 함수에서 모든 JavaScript가 래핑됩니다. 모든 변수는이 함수에 로컬이므로 전역 범위에서 사용할 수 없습니다.

포장 설정을 "포장 없음"으로 변경하면 작동합니다.

http://jsfiddle.net/zalun/Yazpj/1/

사용하지 않는 프레임 워크를 "No Library"로 변경했습니다.


22

또 다른 방법은 다음과 같은 변수로 함수를 선언하는 것입니다.

test = function() {
  alert("test");
}

jsFiddle


세부

편집 (@nnnnnn의 주석에 따라)

@nnnnnn :

왜 test =(없이 var) 그것을 고칠까요?

다음과 같은 함수를 정의 할 때 :

var test = function(){};

함수는 로컬로 정의되지만 다음없이 함수를 정의 할 때 var:

test = function(){};

testwindow최상위 범위 에있는 개체 에 정의됩니다 .

이것이 왜 작동합니까?

@zalun처럼 말하십시오 :

랩 설정을 지정하지 않으면 기본값은 "onLoad"입니다. 결과가로드 된 후 실행되는 함수에서 모든 JavaScript가 래핑됩니다. 모든 변수는이 함수에 로컬이므로 전역 범위에서 사용할 수 없습니다.

그러나이 구문을 사용하는 경우 :

test = function(){};

함수는 test전역 적으로 정의 되어 있으므로 액세스 할 수 있습니다.


참고 문헌 :


2
이것은 JSFiddle에서 아주 작은 코드를 테스트하는 것입니다.
— DOK

그러나 이것이 작동하는 이유 는 무엇입니까? 제공 한 "추가 정보"링크는 문제가 범위와 관련이 있거나 test = (없이 var) 라고 말하면 문제가 해결되는 이유를 설명하지 않습니다 .
— nnnnnn

@ R3tep 잘 첫 번째 링크 : jsfiddle.net/R3tep/Yazpj/1406 경고는 나를 위해 아무것도하지 않습니다. 나는 크롬에있다.
— Ced

@ R3tep 예, console.log와 함께 작동합니다. 나는 경고 상자가 없다는 사실이 iframe과 관련된 다른 문제와 관련이 있다고 믿기 때문에 질문을 게시 할 것입니다.
— Ced

1
@ R3tep 나는 당신이 나를 오해했다고 생각하지만 나는 확실하지 않습니다. 귀하의 코드는 훌륭합니다. JSFiddle이 코딩되는 방식에 문제가 있습니다 (결과를 표시하는 데 사용하는 iframe의 샌드 박스 속성에 누락 된 값). 따라서 일부 버전의 크롬에서는 작동하지 않습니다. 나는 그들의 github에 문제 보고서를 보냈습니다. 나는 내 웹 사이트에서 내가 겪고있는 문제가 똑같지 만 아니라고 생각했기 때문에 그것에 관심이 많았다. 건배.
— Ced

3

Frameworks & Extensions 패널에서 랩 설정을 "랩인 없음 <body>"으로 변경합니다.


-1

코드에는 문제가 없으며 오른쪽에서 onLoad () 확장자를 선택하기 만하면됩니다.


-1
<script> 
function test(){
 alert("test");   
}
</script>

<input type="button" value="test" onclick="test()">

-3
Select OnDomready

HTML :

<input id="dButton" type="button" value="test"/>

자바 스크립트 :

addEventListener('load', init, false);

function init()
{
  oInput = document.getElementById('dButton');
  oInput.onclick = test;
}

function test(){
  alert("test");
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.