Невозможно заставить простой Javascript работать в Firefox

У меня достаточно опыта работы с 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) ;

 ?>

Что именно идет не так в Firefox? Вы можете объяснить проблему?

CertainPerformance 28.10.2018 11:00
var theLink = encodeURIComponent(document.getElementsByClassName('theLink'‌​)) ; не имеет большого смысла. Вы полагаетесь на неявное преобразование HTMLCollection в строку. (В Chrome это вернет строку "%5Bobject%20HTMLCollection%5D".) Какова цель этой строки?
T.J. Crowder 28.10.2018 11:01

С извинениями, я не верю, что код в вопросе «... функционирует должным образом в IE, Opera и Chrome ...». Вы запускаете асинхронный ajax в ответ на щелчок по ссылке, пытаясь отправить "%5Bobject%20HTMLCollection%5D" на PHP. page (но он туда не попадет, потому что страница, инициирующая запрос, удаляется до того, как запрос действительно запускается, потому что он переходит на страницу назначения.

T.J. Crowder 28.10.2018 11:05

Если вы пытаетесь отправить на сервер сведения о нажатой ссылке, с текущим кодом у вас будет состояние гонки между завершением запроса AJAX и выгрузкой текущей страницы браузером.

fubar 28.10.2018 11:06
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
51
1

Ответы 1

Эта строка:

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, так и предотвращение использования по умолчанию дадут вам вводящую в заблуждение статистику, потому что щелчок правой кнопкой мыши по ссылке и ее открытие в новой вкладке / окне не будут записаны. Или, если кто-то скопирует адрес ссылки, откроет новое окно и вставит его, это тоже не будет записано.

По сути, такой подход не может работать надежно. Страница, на которую вы попадаете, должна отправлять информацию, которую вы на нее попали.

Спасибо всем за ваши быстрые комментарии. Для меня не удивительно, что я иду почти в неверном направлении! ;-)

tonyw 28.10.2018 12:47

И TJC, да, как опубликовано здесь, он не работает в браузерах, как я утверждал ... Он действительно работал, поэтому я немного не понимаю, почему (возможно, проблема кеширования). Мое единственное замечание: (из того, что я прочитал) произойдет onClick, а затем «return true» позволит перенаправить на href. Спасибо за предложенные доработки кода - буду экспериментировать. Ясно, что здесь нужны дополнительные (глубокие) размышления, но, если можно, я вернусь через день или два.

tonyw 28.10.2018 13:01

Другие вопросы по теме