Вызов функции после загрузки результатов пользовательского поиска Google?
Мне нужно выполнить код jQuery после того, как результаты поиска будут отображены на моей странице. Я могу использовать любой код v1:
<div id="cse" style="width: 100%;">Loading</div>
<script src="http://www.google.com/jsapi" type="text/javascript"></script>
<script type="text/javascript">
google.load('search', '1', {language : 'en', style : google.loader.themes.V2_DEFAULT});
google.setOnLoadCallback(function() {
var customSearchOptions = {};
var orderByOptions = {};
orderByOptions['keys'] = [{label: 'Relevance', key: ''},{label: 'Date', key: 'date'}];
customSearchOptions['enableOrderBy'] = true;
customSearchOptions['orderByOptions'] = orderByOptions; var customSearchControl = new google.search.CustomSearchControl(
'zzzzzzzzzzzz', customSearchOptions);
customSearchControl.setResultSetSize(google.search.Search.FILTERED_CSE_RESULTSET);
var options = new google.search.DrawOptions();
options.setAutoComplete(true);
customSearchControl.setAutoCompletionId('zzzzzz:zzzzzzz+qptype:3');
options.enableSearchResultsOnly();
customSearchControl.draw('cse', options);
function parseParamsFromUrl() {
var params = {};
var parts = window.location.search.substr(1).split('\x26');
for (var i = 0; i < parts.length; i++) {
var keyValuePair = parts[i].split('=');
var key = decodeURIComponent(keyValuePair[0]);
params[key] = keyValuePair[1] ?
decodeURIComponent(keyValuePair[1].replace(/\+/g, ' ')) :
keyValuePair[1];
}
return params;
}
var urlParams = parseParamsFromUrl();
var queryParamName = "q";
if (urlParams[queryParamName]) {
customSearchControl.execute(urlParams[queryParamName]);
}
}, true);
</script>
Или код v2:
<!-- Put the following javascript before the closing </head> tag. -->
<script>
(function() {
var cx = 'xxxxxxxxx';
var gcse = document.createElement('script'); gcse.type = 'text/javascript'; gcse.async = true;
gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') +
'//www.google.com/cse/cse.js?cx=' + cx;
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(gcse, s);
})();
</script>
Я пытался поместить свой вызов функции в различных местах кода, но безрезультатно.
У меня есть функция, которая должна динамически устанавливать высоту контейнера, в котором отображаются результаты поиска, поэтому после загрузки результатов мне нужно вызвать ее, иначе моя страница отображается неправильно.
Вот ссылка на документацию по API v2: https://developers.google.com/custom-search/docs/element и v1: https://developers.google.com/custom-search/docs/js/cselement-reference. Я не вижу ничего, где есть обратный вызов при отображении результатов поиска, только при инициализации. Кажется сумасшедшим, хотя нет поддержки такого рода.
Вот что я пробовал с v2:
(function () {
var cx = 'xxxxxxxxx';
var gcse = document.createElement('script'); gcse.type = 'text/javascript'; gcse.async = true;
gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') +
'//www.google.com/cse/cse.js?cx=' + cx;
gcse.onreadystatechange = gcse.onload = function () {
console.log("executed");
SetMainHeight(20);
};
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(gcse, s);
})();
Консоль никогда не выводит "выполнено". Также я замечаю в своей консоли, у меня есть следующая ошибка:
Небезопасная попытка JavaScript получить доступ к фрейму с URL-адресом: пусто из фрейма с URL-адресом http://www.google.com/cse?q=test&client=google-coop&hl=en&r=s&cx=xxxxx s1%2Csr1&rurl=http%3A%2F%2Flocalhost%3A58257%2FSearch%3Fq%3Dtest# рабыня-1-1. Домены, протоколы и порты должны совпадать.
Не уверен, что это имеет значение, так как функция поиска все еще работает нормально. Я тестирую это на локальном хосте через http.
3 ответа
К сожалению, v2 не имеет этой способности, но в v1 вы можете использовать:
.setSearchCompleteCallback(object, method)
Вы можете найти его на этой странице.
Предыдущие решения у меня не сработали, но вот что у меня сработало:
<script>
(function() {
window.__gcse = {
callback: myCallback
};
function myCallback() {
$('input.gsc-input').keyup(function(e) { if(e.keyCode == 13 || e.which == 13) { console.log('enter pressed'); }});
$('input.gsc-search-button').on('click', function(e) { console.log('clicked');});
}
var cx = '002806224466286757728:XXXXXXX';
var gcse = document.createElement('script');
gcse.type = 'text/javascript';
gcse.async = false;
gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') +
'//www.google.com/cse/cse.js?cx=' + cx;
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(gcse, s);
})();
</script>
<gcse:search></gcse:search>
Надеюсь это поможет
Например, для версии 2 попробуйте установить обработчик onload для объекта gcse (сценария), прежде чем вставлять его в DOM.
gcse.onreadystatechange = gcse.onload = function() {
//execute my code
};
в основном вы в конечном итоге:
<!-- Put the following javascript before the closing </head> tag. -->
<script>
(function() {
var cx = 'xxxxxxxxx';
var gcse = document.createElement('script'); gcse.type = 'text/javascript'; gcse.async = true;
gcse.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') +
'//www.google.com/cse/cse.js?cx=' + cx;
gcse.onreadystatechange = gcse.onload = function() {
//execute your code here
};
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(gcse, s);
})();
</script>