Да, вы можете сделать var
частью опций chunk, например
<<cached, cache=TRUE, cache.whatever=var>>=
@
cache.whatever
не является официальным именем опции chunk, но вы можете использовать произвольные параметры в knitr
, и они повлияют на недействительность кеша. В этом случае, когда обновляется var
, кеш будет обновлен.
Если вы хотите var
воздействовать на все кешированные фрагменты, вы можете установить его как глобальную опцию, но не забудьте установить его как неоценимое выражение:
opts_chunk$set(cache.whatever = quote(var))
Вы можете использовать произвольные выражения R внутри quote()
, поэтому, если у вас больше переменных, вы можете поместить их в список, например
opts_chunk$set(cache.whatever = quote(list(var1, var2)))
ОБНОВЛЕНИЕ: Закрытия являются действительно ответом. Таким образом, после игры с ним еще немного, я выяснил, почему закрытия были первоначально проблематичны и как зафиксировать его. Хитрая вещь с закрытием - Вы, должны быть осторожными при итерации через элементы для не окончания со всеми закрытиями, ссылающимися на тот же элемент. Например, это не работает:
for (var i = 0; i < elements.length; i++) {
var element = elements[i];
var button = document.createElement("button");
button.addEventListener("click", function(ev) {
// do something with element here
}, false)
}
, Но это делает:
var buildListener = function(element) {
return function(ev) {
// do something with event here
};
};
for (var i = 0; i < elements.length; i++) {
var element = elements[i];
var button = document.createElement("button");
button.addEventListener("click", buildListener(element), false)
}
Так или иначе, я решил не выбрать один ответ, потому что вопрос имел два ответа: 1) Нет, нет никаких внутренних идентификаторов, которые можно использовать; 2) необходимо использовать закрытия для этого. Так я просто upvoted первые люди, которые скажут, были ли внутренние идентификаторы или кто рекомендовал генерировать идентификаторы плюс кто-либо, кто упомянул закрытия. Спасибо за справку!
Если Вы не изменяете DOM, можно получить их всех согласно индексируемому порядку:
( Прототип пример)
myNodes = document.body.descendants()
alert(document.body.descendants()[1].innerHTML)
Вы могли циклично выполниться через все узлы и дать им уникальное имя класса, которое Вы могли позже выбрать легко.
what()
вывод только хранится к файлу журнала, это находится на некотором уровне " представленный user" и потребности не быть мусором.
– John Dibling
21 September 2010 в 14:35
Если Вы можете запись к DOM (я уверен, что Вы можете). Я решил бы это как это:
Имеют функциональный возврат или генерируют идентификатор:
//(function () {
var idCounter = new Date().getTime();
function getId( node ) {
return (node.id) ? node.id : (node.id = 'tempIdPrefix_' + idCounter++ );
}
//})();
Использование это для получения идентификатора по мере необходимости:
var n = document.getElementById('someid');
getId(n); // returns "someid"
var n = document.getElementsByTagName('div')[1];
getId(n); // returns "tempIdPrefix_1224697942198"
Этот способ, которым Вы не должны волноваться о том, на что похож HTML, когда сервер вручает его Вам.
Немного перепутанный формулировкой Вашего вопроса - Вы говорите "необходимость в идентификаторе строки, который можно использовать для ссылки на тот элемент позже", но что Вы "не можете сохранить ссылки в [своем] сценарии, потому что при необходимости в них сам сценарий GreaseMonkey выйдет из объема".
, Если сценарий выйдет из объема, то, как Вы ссылаетесь на них позже?!
я собираюсь проигнорировать то, что я смущен тем, что Вы достигаете и говорите Вам, что я пишу, что сценарии Механика довольно часто и могут изменять элементы DOM, к которым я получаю доступ, чтобы дать им свойство ID. Это - код, который можно использовать для получения псевдоуникального значения для временного использования:
var PseudoGuid = new (function() {
this.empty = "00000000-0000-0000-0000-000000000000";
this.GetNew = function() {
var fourChars = function() {
return (((1 + Math.random()) * 0x10000)|0).toString(16).substring(1).toUpperCase();
}
return (fourChars() + fourChars() + "-" + fourChars() + "-" + fourChars() + "-" + fourChars() + "-" + fourChars() + fourChars() + fourChars());
};
})();
// usage example:
var tempId = PseudoGuid.GetNew();
someDomElement.id = tempId;
, Который работает на меня, я просто протестировал его в сценарии Механика сам.
<час>ОБНОВЛЕНИЕ: Закрытия являются способом пойти - лично как жесткий разработчик JavaScript, я не знаю, как Вы не сделали , сразу думают о тех.:)
myDomElement; // some DOM element we want later reference to
someOtherDomElement.addEventListener("click", function(e) {
// because of the closure, here we have a reference to myDomElement
doSomething(myDomElement);
}, false);
Теперь, myDomElement
один из элементов, которые Вы, по-видимому, из Вашего описания, уже имеете вокруг (так как Вы думали о добавлении идентификатора к нему, или безотносительно).
, Возможно, при регистрации примера того, что Вы пытаетесь сделать, было бы легче помочь Вам, предположив, что это не делает.
Закрытие является способом пойти. Таким образом, у Вас будет точная ссылка на элемент, который даже переживет некоторую перестановку DOM.
Пример для тех, кто не знает закрытия:
var saved_element = findThatDOMNode();
document.body.onclick = function()
{
alert(saved_element); // it's still there!
}
, Если необходимо было сохранить его в cookie, тогда я рекомендую вычислительный XPath для него (например, идите по DOM подсчет предыдущих одноуровневых элементов, пока Вы не найдете элемент с идентификатором, и Вы закончите с чем-то как [@id=foo]/div[4]/p[2]/a
).
XPointer является решением W3C той проблемы.
Можно установить идентификационный атрибут на вычисленное значение. Существует функция в библиотеке прототипа, которая может сделать это для Вас.
http://www.prototypejs.org/api/element/identify
Моей любимой библиотекой JavaScript является jQuery. К сожалению, jQuery не имеет функции, любят, определяют. Однако можно все еще установить идентификационный атрибут на значение, которое Вы генерируете самостоятельно.
http://docs.jquery.com/Attributes/attr#keyfn
Вот является частичным отрывком из документов jQuery, который устанавливает идентификатор для отделений на основе положения на странице:
$(document).ready(function(){
$("div").attr("id", function (arr) {
return "div-id" + arr;
});
});
В JavaScript Вы могли присоединить пользовательское поле ID к узлу
if(node.id) {
node.myId = node.id;
} else {
node.myId = createId();
}
// store myId
, Это - немного взлома, но это даст каждому узлу идентификатор, который можно использовать. Конечно, document.getElementById()
не обратит внимание на него.
Можно также использовать pguid (уникальный идентификатор страницы) для поколения уникального идентификатора:
pguid = b9j.pguid.next() // A unique id (suitable for a DOM element)
// is generated
// Something like "b9j-pguid-20a9ff-0"
...
pguid = b9j.pguid.next() // Another unique one... "b9j-pguid-20a9ff-1"
// Build a custom generator
var sequence = new b9j.pguid.Sequence({ namespace: "frobozz" })
pguid = sequence.next() "frobozz-c861e1-0"
Ответ не, нет внутреннего идентификатора, к которому можно получить доступ. Opera и IE (возможно, Safari?) поддержка .sourceIndex
(который изменяется, если DOM делает), но Firefox не имеет ничего из этого вида.
можно моделировать исходный индекс путем генерации Xpath к данному узлу или нахождения индекса узла от document.getElementsByTagName('*')
, который будет всегда возвращать элементы в исходном порядке.
Все это требует абсолютно статического файла, конечно. Изменения в DOM повредят поиск.
то, Что я не понимаю, - то, как можно освободить ссылки на узлы, но не на (теоретический) внутренний идентификатор? Или закрытия и присвоения работают, или они не делают. Или я пропускаю что-то?
ofstream
(и другой " concrete" потоковые типы), подвижны и выгружаемы.
– Howard Hinnant
26 December 2013 в 16:33
Используйте мышь и / или позиционные свойства элемента для создания уникального идентификатора.
Я «думаю», что только что решил проблему, подобную этой. Однако я использую jQuery в среде DOM браузера.
var objA = $("селектор к некоторому элементу dom"); var objB = $("селектор к какого-то другому элементу dom");
if( objA[0] === objB[0]) { ПРЕКРАСНО! Эти два объекта указывают на один и тот же узел DOM }
char const*
не имеет никакого отношения к кодировке символов. – Alexandre C. 21 September 2010 в 14:37