У меня достаточно опыта работы с PHP, MySQL, HTML и CSS, но я испытываю трудности на ранних этапах изучения Javascript. У меня есть сценарий, который работает должным образом в IE, Opera и Chrome, но не в Firefox.
Вот два соответствующих сценария. Это мой первый пост здесь, поэтому прошу прощения, если я сделал это неправильно. Тем не менее, руководство будет оценено.
<html>
<!-- The purpose of this script is to to capture the details of the hotlink that was clicked without affecting the visible hotlink destination -->
<!-- This script works in IE, Chrome and Opera, but not Firefox -->
<head>
<title>Dev</title>
<meta http-equiv = "Content-Type" content = "text/html; charset=iso-8859-1">
<script src = "jQuery.js"></script>
<script>
function myBasic(pgnm){
var page = pgnm ;
var theLink = encodeURIComponent(document.getElementsByClassName('theLink')) ;
// the alert window displays the correct data
window.alert(theLink + "\n" + page);
jQuery.post("catchIt.php?link = " + theLink + "&pg = " + page) ;
return true ;
}
</script>
</head>
<body bgcolor = "#FFFFFF" text = "#000000">
<!-- This is a series of many hotlinked URLs that need to be recorded and stored in a mySql table -->
<!-- The pagename and hotlinks will be inserted via a PHP script -->
<p><a onClick = "myBasic('pagename.php');" href = "destination.php" class = "theLink">(Not) Working script</a></p>
<p><a onClick = "myBasic('anotherPagename.php');" href = "http://example.com/destination.php?a=1&b=2" class = "theLink">Another (Not) Working script</a></p>
</body>
</html>
(catchIt.php)
$thisString = $_GET['link'] ;
$page = $_GET['pg'] ;
$thisDate = date('Y-m-d H:i:s') ;
$thisIp = $_SERVER['REMOTE_ADDR'] ;
// the remained of this code has already been developed to write the details to the mySql table
// the code below is there to prove the success of this script
$thisString .= '
' . $thisDate . '
' . $thisIp . '
' . $page ;
$file = fopen("theWords.txt","w");
fwrite($file, $thisString) ;
fclose($file) ;
?>
var theLink = encodeURIComponent(document.getElementsByClassName('theLink')) ; не имеет большого смысла. Вы полагаетесь на неявное преобразование HTMLCollection в строку. (В Chrome это вернет строку "%5Bobject%20HTMLCollection%5D".) Какова цель этой строки?
С извинениями, я не верю, что код в вопросе «... функционирует должным образом в IE, Opera и Chrome ...». Вы запускаете асинхронный ajax в ответ на щелчок по ссылке, пытаясь отправить "%5Bobject%20HTMLCollection%5D" на PHP. page (но он туда не попадет, потому что страница, инициирующая запрос, удаляется до того, как запрос действительно запускается, потому что он переходит на страницу назначения.
Если вы пытаетесь отправить на сервер сведения о нажатой ссылке, с текущим кодом у вас будет состояние гонки между завершением запроса AJAX и выгрузкой текущей страницы браузером.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Эта строка:
var theLink = encodeURIComponent(document.getElementsByClassName('theLink')) ;
устанавливает theLink в "%5Bobject%20HTMLCollection%5D" в Chrome. Если целью было получить href ссылки, по которой щелкнули, вам необходимо передать ссылку в вашу функцию и использовать ее свойство href. Минимальные изменения для этого:
<a onClick = "myBasic(this, 'pagename.php');" ...
а также
function myBasic(element, pgnm){
var page = pgnm ;
var theLink = encodeURIComponent(element.href);
// ...
Затем, однако, вам нужно будет отправить ajax-запрос синхронный (что является действительно плохой идеей), чтобы гарантировать завершение публикации до того, как страница будет снесена из-за перехода по ссылке.
Вы можете запретить действие по умолчанию (следуя ссылке), а затем перейти на страницу после завершения ajax.
Но как синхронный ajax, так и предотвращение использования по умолчанию дадут вам вводящую в заблуждение статистику, потому что щелчок правой кнопкой мыши по ссылке и ее открытие в новой вкладке / окне не будут записаны. Или, если кто-то скопирует адрес ссылки, откроет новое окно и вставит его, это тоже не будет записано.
По сути, такой подход не может работать надежно. Страница, на которую вы попадаете, должна отправлять информацию, которую вы на нее попали.
Спасибо всем за ваши быстрые комментарии. Для меня не удивительно, что я иду почти в неверном направлении! ;-)
И TJC, да, как опубликовано здесь, он не работает в браузерах, как я утверждал ... Он действительно работал, поэтому я немного не понимаю, почему (возможно, проблема кеширования). Мое единственное замечание: (из того, что я прочитал) произойдет onClick, а затем «return true» позволит перенаправить на href. Спасибо за предложенные доработки кода - буду экспериментировать. Ясно, что здесь нужны дополнительные (глубокие) размышления, но, если можно, я вернусь через день или два.
Что именно идет не так в Firefox? Вы можете объяснить проблему?