2013-04-24 3 views
-2

Я новичок в javascript. Как анонимность Google Pagespeed?Анонимный Google Pagespeed

Оригинальный код: http://pastebin.com/xRbTekDA. Он работает, когда загружается страница

Присвоен код: http://pastebin.com/fj9rP7FM. Он показывает ошибку javascript каждый раз, когда я загружаю страницу. Он говорит: «ReferenceError: runPagespeedCallbacks не определен», потому что я анонимизировал его.

Как я могу анонимизировать этот оригинальный код?

ответ

1

Проблема, с которой вы сталкиваетесь, - это метод, который код, ожидающий вызова, не входит в объем. Поэтому, если вы немного измените код, это должно избавить вас от ошибки. Этот код должен устранить проблему. http://pastebin.com/RrQ2848j

Обратите внимание, что я просто возвращаю функцию обратного вызова и назначаю ее как переменную. Существуют и другие подходы, которые вы можете предпринять, но в глобальном масштабе для вызова требуется нечто.

Причина этого заключается в создании блока сценария для получения сценария и данных, поскольку запрос AJAX (XHR) будет нарушать политику одного и того же происхождения, пытающуюся связаться с google.com во время выполнения на вашем домене. Когда скрипт загружен, ожидается, что он вызовет функцию в глобальной области, чтобы передать в нее некоторые данные. Эта функция названа в строке запроса атрибута SRC при создании блока сценария, как показано здесь:

function runPagespeed() { 
    var s = document.createElement('script'); 
    s.type = 'text/javascript'; 
    s.async = true; 
    var query = [ 
    'url=' + YN_URL, 
    'callback=runPagespeedCallbacks', 
    'key=' + API_KEY 
    ].join('&'); 
    s.src = API_URL + query; 
    document.head.insertBefore(s, null); 
} 
+0

Спасибо. Он работает – yan

+0

Вы понимаете, почему? Я чувствую, что, поскольку вы студент, я не обязан отвечать за то, чтобы вы знали, почему сейчас. :-) –

+0

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

0

Единственное различие между ними состоит в том, что второе обернуто в выражение, вызываемое непосредственно вызываемым (IIFE). IIFE инкапсулирует код так, чтобы свободные переменные не были глобально видимыми. Обычно это хорошо, но если другие службы полагаются на этот код, он не будет виден.

+0

Я хочу скрыть его из глобальной области. Это мое задание для моей стажировки. Мой руководитель хочет, чтобы я анонимизировал его, чтобы люди не могли изменить API_KEY и вызывать функции с консоли. – yan

+0

Итак, вы пытаетесь только разоблачить некоторые части кода в глобальном, скрывая других. –

+0

Да. Какие части кода должны быть глобальными? – yan

Смежные вопросы