2011-04-25 3 views
13

저는 CodeIgniter 응용 프로그램을 만들고 있습니다.여러 개의 <script> 블록에서 JS 변수 공유

보기가 있는데, Calendar에 JS/jQuery <script> 블록이 있습니다. 다음과 같습니다 : 다른 관점에서

$(document).ready(function() { 

     $("#day_list").fadeIn(600); 

     // init 
     var current_month = <?= $init['current_month']; ?>; 
     var current_year = <?= $init['current_year'] ?>; 

     // previous, next month ajax call 
     $(".previous, .next").click(function(event) { 
      // do stuff to these variables, then ajax call. 
      $.ajax({ 
       // ajax 
      }); 
     }); 
    }); 

, 내 바닥 글을, 나는 같은 변수 (current_month 및 CURRENT_YEAR)를 사용한다 또 다른 스크립트 블록을 가지고있다. 그러나 그것의 존재에 대해 알지 못합니다. 첫 번째 <script> 블록에서이 변수를 다른 블록으로 전달하는 가장 빠르고 쉬운 방법은 무엇입니까? 내 응용 프로그램이 빌드되는 방식 때문에 두 블록을 함께 놓을 수 없습니다. 이 값을 가져오고 반환하는 함수를 작성해야합니까? (예를 들어,이 작업을 어떻게 수행해야합니까? 저는 그저 초보자입니다) 또는 더 쉬운 방법이 있습니까?

고맙습니다.

답변

15

자바 스크립트에서 변수의 네임 스페이스를 배우는 것이 중요합니다. 범위가 중요하며 많은 부분이 중요합니다. 지금 당신이 "var"키워드를 사용하고 있기 때문에 물건은 로컬 범위에 있습니다.

여기에있는 다른 답변 중 일부는 사용자를 글로벌 범위로 이동시켜야한다고 말합니다. 무의식적으로 다른 것을 덮어 쓰지 않는 한 작동합니다. 나는이 접근법에 매우 동의하지 않으며, 전역 적으로 범위가 지정된 변수는 JavaScript에서 나쁜 습관입니다.

의 네임은 다음과 같이 작동합니다

var foo = foo || {} //Use existing foo or create an empty object. 
foo.bar = foo.bar || {} 
foo.bar.baz = foo.bar.baz || {} 

등 등

이 더 많은 작업처럼 보일 수 있지만, 그것은 또한 당신의 변수를 보호합니다.

또한 모든 것을 창 개체와 안전하게 이름 짓는 간단한 네임 스페이스 기능을 추가 할 수 있습니다.(나는 옛날 어딘가에서 이걸 찔렀다. 나는 그것을 조금 변형 시켰지만 아마도 그렇지 않을 것이라고 생각한다.)

앱의 상단에 이것을 넣고 당신은 $의 .namespace ("myapp.mydata")에 물건을 네임 스페이스 수 있으며, 다음 myapp.mydata.currentYear = ...

$.namespace = function() { 
    var a=arguments, o=null, i, j, d; 
    for (i=0; i<a.length; i=i+1) { 
     d=a[i].split("."); 
     o=window; 
     for (j=0; j<d.length; j=j+1) { 
      o[d[j]]=o[d[j]] || {}; 
      o=o[d[j]]; 
     } 
    } 
    return o; 
}; 

또한, 만약 말 당신이 새로운 사람이거나 하드 코어를 원한다면, 나는 Crockford의 JavaScript 좋은 부분을 읽는 것이 좋습니다.

+0

감사. 나는 개념에 대해 머리를 감싸 으면 확실히 시도 할 것입니다. 이 책을 추천 해 주셔서 감사합니다. 나는 책을 집어 들겠다는 의미를 지니고 있지만 그 중 많은 책들이있다. 하하. 감사! – cabaret

+0

문제가 없습니다. Good Part는 많은 사람들이 JavaScript 언어에 대한 최종적인 책으로 간주됩니다. – JSager

13

전역 변수로 선언하십시오. 문서 준비 기능 외부로 이동하십시오.

var current_month = <?= $init['current_month']; ?>; 
var current_year = <?= $init['current_year'] ?>; 

$(document).ready(function() { 
.... 
}); 

current_monthcurrent_year 이제 모든 스크립트 블록에서 액세스 할 수 있습니다.

+0

도우, 고마워요! – cabaret

+0

아 .... 좋은 감사. 또한 (function ($) {}) (jQuery) 외부로 이동해야했습니다. 싸개. – Andrew

3

함수 블록 외부에서 변수를 선언하면 해당 변수는 전역 변수가되어 페이지의 모든 스크립트에서 사용할 수 있습니다.

var current_month; 
var current_year; 

$(document).ready(function() { 

    // init 
    current_month = <?= $init['current_month']; ?>; 
    current_year = <?= $init['current_year'] ?>; 

    ...etc... 

}); 
1

var는 함수 내부에서 이러한 변수를 선언했기 때문에 로컬 범위가 있습니다. 그들을 글로벌하게 외부로 이동 :

// init 
var current_month = <?= $init['current_month']; ?>; 
var current_year = <?= $init['current_year'] ?>; 

$(document).ready(function() { 

    $("#day_list").fadeIn(600); 

    // previous, next month ajax call 
    $(".previous, .next").click(function(event) { 
     // do stuff to these variables, then ajax call. 
     $.ajax({ 
      // ajax 
     }); 
    }); 
}); 

전역 변수를 갖는 jQuery를 통해 그들을 다음, 당신의 HTML에 의미를 저장, 검색하는 것보다 더 나은 솔루션 :

<body data-month="<?= $init['current_month']; ?>" data-year="<?= $init['current_year'] ?>"> 

$(document).ready(function() { 
    $("#day_list").fadeIn(600); 

    var current_month = $("body").data("month"); 
    var current_year = $("body").data("year"); 

    // previous, next month ajax call 
    $(".previous, .next").click(function(event) { 
     // do stuff to these variables, then ajax call. 
     $.ajax({ 
      // ajax 
     }); 
    }); 
}); 
+0

주로 웹 스타일리스트 인 프론트 엔드 개발자는 나중에 JS 값을 HTML에 저장하여 나중에 가져올 수 있도록 항상 유혹하고 있지만, 실제로는 좋은 유지 보수가 가능한 솔루션입니까? –

3

은 "VAR"선언이 초기화를 두 변수 (current_month, current_year)는 준비 기능 범위에 있으므로 다른 곳에서는 사용할 수 없습니다. 다음과 같이 전체적으로 선언 할 수 있습니다.

var current_month; 
var current_year; 
$(document).ready(function() { 
    ... 
    current_month = ... 
} 

그런 식으로 하단 스크립트에서 사용할 수 있습니다.

관련 문제