TL; DR, чтобы выполнить то, что вы делаете, у вас есть три варианта:
- Сохранение ссылки на событие в глобальном значении (что большинство учебных пособий -как ваше ссылочное видео на YouTube - рекомендую вам сделать).Это требует, чтобы событие запускалось в том же контексте (т. Е. Веб-странице), что и при сохранении ссылки
- Когда вы сохраняете ссылку на событие в localStorage (например, по имени илипоиск ключа / значения), на странице / контексте, где вы хотите выполнить событие, убедитесь, что соответствующие функции и библиотеки загружены до выполнения события
- [настоятельно НЕ рекомендуется]Сохраните исходный код javascript в своем хранилище и eval () его позже [снова, пожалуйста, не делайте этого]
Как упоминали @Josh и @SaurabhRajpal, то, что вы просите, строго говоря, не возможно в JavaScript.То, что вы делаете с JSON.stringify(e)
, вероятно, вернет undefined
или null
, поскольку документация MDN для JSON.stringify говорит:
Если значение не определено, функция,или Символ встречается во время преобразования, он либо опускается (когда он найден в объекте), либо подвергается цензуре на ноль (когда он находится в массиве).JSON.stringify также может просто возвращать undefined при передаче «чистых» значений, таких как JSON.stringify (function () {}) или JSON.stringify (undefined).
Короче, тамневозможно сохранить одну функцию в localStorage (или любом другом автономном хранилище) .Чтобы объяснить, почему это невозможно, посмотрите этот пример:
function foo() {
console.log("a")
}
function bar() {
return foo()
}
Как вы можете хранить bar()
для дальнейшего использования?Чтобы хранить бар, вы должны также хранить foo()
.Это становится намного сложнее, когда вы рассматриваете ссылку на функцию, которая находится в большой библиотеке или использует ее (например, jQuery, подчеркивание, D3, библиотеки диаграмм и т. Д.).Имейте в виду, ваш компьютер уже проанализировал исходный код в двоичном , и поэтому не может легко узнать, как читать функцию для всех возможных операторов if, for и switch, чтобы гарантировать все возможные коррелированные функции.и библиотеки сохраняются.
Если бы вы действительно хотели сделать это, вам нужно было бы написать свой собственный анализатор javascript, а вы действительно не хотели бы делатьэто!
Так, каковы ваши варианты?Сначала сделайте все на той же странице и сохраните ссылку на событие в глобальном значении (этот метод используется в видео на YouTube, на которое вы ссылаетесь в комментарии).
Второй вариант - использовать ссылка на событие (не на само событие), и убедитесь, что исходный код для этой ссылки используется позже.Для примера (html):
// on page #1
<script src="path/to/my/js/library.js"></script>
...
<script>
window.addEventListener('beforeinstallprompt', (e) => {
e.preventDefault()
localStorage.setItem('stashed-event', 'before-install')
})
</script>
// later, on page #2:
<script src="path/to/my/js/library.js"></script>
...
<script>
var evt = localStorage.setItem('stashed-event', 'before-install')
if(evt == 'before-install') {
dosomething() // which would be a function in path/to/my/js/library.js
}
// another option here would be to define window listeners for all possible events
// in your library.js file, and then simply build and trigger the event here. for
// more about this, see: this link:
// https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events
</script>
Наконец, вы можете сохранить исходный код javascript, а затем eval () позже.Пожалуйста, пожалуйста, пожалуйста, НЕ делайте этого.Это плохая практика и может привести к очень злым вещам.Но, если вы настаиваете:
// on page #1
window.addEventListener('beforeinstallprompt', (e) => {
e.preventDefault()
SomeAjaxFunction("path/to/my/js/library.js", function(responseText) {
localStorage.setItem('stashed-event', {
name: 'before-install',
call: 'beforeInstallFunction()',
src: responseText
})
})
})
// later, on page #2:
var evt = localStorage.setItem('stashed-event', 'before-install')
if(evt) {
console.log("triggering event " + evt.name)
eval(evt.src)
eval(evt.call)
}
Как я уже сказал, это действительно плохая идея, но это вариант.
ИМХО, я думаю, вы пытаетесь избежать включения библиотекиили исходный код на более поздней странице / приложение / что угодно, и Javascript просто не работает таким образом.Лучше всего передавать ссылки в памяти и использовать только хранилище ключей / значений для имен.Все остальное - это разновидность гимнастики кодирования, которую следует избегать, просто включив исходный код в те места, где он не должен быть включен.