JQuery глобальный выбор "кеш" - PullRequest
0 голосов
/ 04 ноября 2011

Я не думаю, что я первый столкнулся с этой проблемой, но я не нашел способа искать это, не получив результатов, которые не имеют никакого отношения к проблеме.

Я принял не слишком распространенную хорошую практику "кэширования" повторяющихся выборок jQuery в переменные типа var element = $('#element');, чтобы предотвратить "поиск пула DOM" при каждом повторном использовании элемента

У меня проблема в том, что сейчас я делаю это кэширование внутри функции. Что-то вроде:

function functionname (id) {
    var id = $('#'+id);
    //extra stuff
}

Я не эксперт в области переменных, но не могу сделать

functionname ('some-div-id');
some-div-id.dialog('open');

Так что я уверен, что это потому, что переменная, созданная внутри функции, не доступна вне самой функции.

Тогда я придумал

function functionname (id) {
        window.id = $('#'+id);
        //extra stuff
}

но если я попытаюсь сделать window.some-div-id.dialog('open');, я получу TypeError: 'undefined' is not a function

Чего мне не хватает? Я уверен, что это маленькая глупость, но я скучаю по ней прямо перед моими глазами.

Спасибо


EDIT

Спасибо всем, но вы что-то упустили. В предложениях по коду отсутствует тот факт, что внутреннее «глобальное» имя переменной является динамическим:

var CACHEobject = {};

function doSomething (NAMEHERE) { //note the function parameter 
   CACHEobject.NAMEHERE = $('#'+NAMEHERE);
}

Таким образом, идея заключается в том, что функция создает переменную javascript с тем же именем, что и #element_id. Если я передаю имя функции, она должна выбрать идентификатор html с этим именем и «кэшировать его» в глобальную переменную с таким же именем:

doSomething('myDialogOne'); doSomething('myDialogTwo');

так что позже я смогу сделать

CACHEobject.myDialogOne.dialog('open'); CACHEobject.myBox.dialog('close');

Ответы [ 5 ]

1 голос
/ 04 ноября 2011

Это то, что вы хотите (на основе редактирования):

var CACHEobject = {};
function doSomething(id) { 
   CACHEobject[id] = $('#' + id);
}
1 голос
/ 04 ноября 2011

Ваша идея в порядке. Просто установите объект для этого. Вот пример использования STASH в качестве объекта кэширования:

<html>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script>
var STASH = {};
$(document).ready(function(){

    // stash your elements
    STASH.item = $('#item');
    STASH.otherItem = $('#otherItem');


    // do stuff to them
    STASH.item.css({
        color: '#f00'
    }); // sets #item to red
    alert(STASH.otherItem.text()); // alerts foo
});
</script>
<style></style>
<body>
    <div id="item">bar</div>
    <div id="otherItem">foo</div>
</body>
</html>
0 голосов
/ 04 ноября 2011
function setDialog(selector) {
    window.$dialogElem = $(selector);
    //window.dialogSelector = selector; 
}

var id= 'mensajes';
setDialog('#'+id);
window.$dialogElem.dialog();
//$(window.dialogSelector).dialog();

комментарий - это альтернатива, которая занимает меньше памяти. Но почему, черт возьми, использовать окно ?? проверьте эту скрипку для различных простых техник.

0 голосов
/ 04 ноября 2011

Вы можете просто объявить переменную вне функции.

var $foo;

function some_function(id) {
  $foo = $('#' + id);
}
0 голосов
/ 04 ноября 2011
window.some-div-id.dialog('open');

интерпретируется как:

window.some - div - id.dialog('open');

то есть вычитание, которое вызывает три неопределенных переменных, одна из которых id.dialog, которая вызывает ошибку при попытке выполнения в качестве функции.

Для специальных символов используйте:

window["some-div-id"].dialog('open');

И для определения:

window[id] = $("#" + id);

В любом случае, я бы не советовал вам использовать глобальные переменные.Вам лучше переписать функцию jQuery для реализации кэширования (используя объект с селектором в качестве ключа и соответствующий элемент в качестве значения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...