2010-07-13 5 views
0

как я могу захватить аргументы функции javascript?grab javascript функции аргументы

ниже мой код,

<script type="text/javascript"> 
var pageTracker = _gat._getTracker("UA-45-9"); 
pageTracker._trackPageview();pageTracker._addTrans("3128", "", "20.4600", "0.0000", "8.1900", "SFO", "CA", "US"); 
pageTracker._addItem("3128", "23317", "Cheese ", "", "6.2900", "1"); 
pageTracker._addItem("3128", "23318", "Lazzaroni", "", "1.9900", "1"); 
pageTracker._addItem("3128", "23316", "Italian Food", "", "3.9900", "1"); 
pageTracker._trackTrans(); 
</script> 

Для кода выше, я хочу, чтобы захватить аргументы функций pageTracker._addItem(), чтобы использовать его в моем яваскрипта коде. Как я могу это сделать?

Проблема в том, что у меня нет доступа ко всему исходному коду, но только я могу добавить к нему javascript и html, этот сайт размещен в сетевых решениях, и они не предоставляют доступ к их коду для некоторых планов .... так что мне нужно, чтобы захватить аргументы функции яваскрипта выше, и использовать это мой JavaScript, который я могу добавить к коду ...

Благодаря

+0

Вы хотите динамически извлечь их со страницы? Разве вы не установили это на своем сайте? Я не совсем понимаю этот вопрос. – spinon

+0

И я тоже. Что вы подразумеваете под «Grab» здесь? Кто должен делать захват, другой Javascript? –

+0

Одним из решений является замена 'pageTracker .__ addItem' с помощью обертки, которая записывает, а затем вызывает фактическую функцию, но, не зная больше о намерениях OP, нет смысла пытаться найти решение, которого просто не может быть. – Anurag

ответ

3

Используйте это:

GAitems = []; 
GAitems.oldAdd = pageTracker._addItem; 
pageTracker._addItem = function() { 
    GAitems.push(arguments); 
    GAitems.oldAdd.apply(pageTracker, arguments) 
}​ 

И все добавленные элементы будут доступны в GAitems массив для вас (и они также добавляют в Google Analytics правильно).

+0

Sweet! Но он говорит в комментарии к моему ответу, что он не может изменить код трекера. Вам придется переопределить '_addItem'. Может ли это быть сделано в Javascript при сохранении функциональности предка (что-то вроде 'parent :: methodname()'?) Если это возможно - возможно, если сохранить старый метод в '_addTrans_old()'? - Это определенно путь. –

+0

спасибо, что я не видел, что он не может изменить код. Обновлено – galambalazs

+0

hmmm большая проблема .... в любом случае ... спасибо много galamblazz и pekka ... если есть какой-нибудь другой выход, пожалуйста, дайте мне знать .... – texpert

0

Предполагая, что вы имеете в виду вы хотите проанализировать выше код в некотором JavaScript, который приходит после, я бы сказал, что нет простого способа сделать это. Вы можете получить добавленные item записи обратно из объекта pageTracker, но это звучит hard.

Если возможно, я рекомендовал бы отслеживать добавленные элементы в собственном массиве.

+0

Проблема в том, что у меня нет доступа ко всему исходному коду, но я могу добавить только javascript и html, этот сайт размещен в сетевых решениях, и они не предоставляют доступ к их коду для некоторых планов .... так что мне нужно захватить аргументы функции javascript выше и использовать его в javascript, который я могу добавить к коду ... – texpert

1

Основываясь на новой информации, теперь имеет смысл ответить на эту проблему.

Является ли источником сетевых решений в iframe? Если да, совместим ли протокол, домен и порты, где живет ваш сценарий, и откуда берется сценарий сетевых решений? Если этого не произойдет, вы не сможете получить доступ к какой-либо его части.

Если это не в IFRAME и не скрыты внутри CLOSURES, то вы можете получить доступ к аргументам pageTracker._addItem(..), но есть еще одна проблема с этим. Так как я предполагаю, что вы не можете произвольно вставить код в середине своего кода, вы не можете сделать это:

var pageTracker = _gat._getTracker("UA-45-9"); 
// with a swift ninja move, replace pageTracker._addItem with your 
// own implementation here before its first usage 
// but after it has been created 
.. 
pageTracker._addItem("3128", "23317", "Cheese ", "", "6.2900", "1"); 
.. 

Так что я думаю, что вы должны пойти один шаг выше здесь, и поменять реализация _gat._getTracker(..) для возврата измененного объекта pageTracker. Тем не менее, порядок вещей должен быть:

  1. Google Analytics включен (так _gat получает определенный)
  2. Вашего кода приходит сюда, меняющий из реализации ._getTracker и изменяет _addItem метода получившегося объекта.
  3. код Сетевые решения следует

Если вы не можете разместить свой код между Google Analytics <script> и код Network Solutions, то есть мало, что вы можете сделать.Однако, если это было возможно, вот как вы могли бы сделать перехват:

(function(_getTracker) { // _getTracker refers to the original method 
    _gat._getTracker = function() { // swap out the original _gat._getTracker 
     var _pageTracker = _getTracker.apply(_gat, arguments); 
     var _addItem = _pageTracker._addItem; // original _addItem 
     _pageTracker._addItem = function() { // swap out the original _addItem 
      console.log(arguments); // record the arguments here 
      _addItem.apply(_pageTracker, arguments); // send to original method 
     }; 
     return _pageTracker; // return the modified pageTracker 
    }; 
})(_gat.getTracker);