ОБНОВИТЬ:
Я выяснил, что является причиной этой проблемы. У веб-страницы есть часть Javascript, содержащаяся в ее теле, которая предотвращает Javascript body onload=
функция от выполнения в Firefox, Safari и IE. Chrome умеет запускать оба без проблем. Чтобы решить эту проблему, я попытался переместить скрипт внутрь <head>..</head>
однако этот сценарий не будет работать для меня там, похоже, что он должен быть внутри тела (я тоже пытался вызвать его из внешнего файла .js, но он тоже не будет работать). Это функция загрузки тела вместе с проблемным скриптом:
<html>
<head>
//some Javascript & Style files are included here..
</head>
<body onload="getUserDetails()">
<script>
window.onload = function() {
$('#selectAllFriends').change(function(){
if (this.checked) {
$('#mfsForm :checkbox').each(function() {
this.checked = true;
})
}
else {
$('#mfsForm :checkbox').each(function() {
this.checked = false;
})
}
});
}
</script>
//rest of page body is contained here...
</body>
</html>
Этот скрипт необходим как часть селектора мульти-друзей на Facebook. Я думаю, что, возможно, проблема связана с бегом window.onload
а также body onload=
в то же время? Есть ли способ отложить сценарий выбора нескольких друзей на пару секунд, чтобы body onload=
функция для запуска в первую очередь, и это решит проблему?
Оригинальный вопрос:
У меня есть функция Javascript, которая вызывается при загрузке страницы. Внутри этой функции есть вызов API Graph Facebook, этот вызов получает сведения о пользователе из Facebook, а затем передает их с помощью сообщения AJAX в сценарий PHP.
Это Javascript, который я использую:
function getUserDetails() {
FB.login(function(response) {
if (response.authResponse) {
console.log('Welcome! Fetching your information.... ');
FB.api('/me', function(response) {
if (response.error) {
console.log('Error - ' + response.error.message);
}
else {
var userid = response.id;
var userfirst_name = response.first_name;
var userlast_name = response.last_name;
var useremail = response.email;
var usergender = response.gender;
$.ajax({
url: 'insertdetails.php',
data: {'userid' : userid,
'userfirst_name' : userfirst_name,
'userlast_name' : userlast_name,
'useremail' : useremail,
'usergender' : usergender},
type: "POST",
success: function(response){
if(response==1){
alert( "Insert Successful!");
}
else{
alert( "Insert Failed!" );
}
}
});
}
});
} else {
console.log('User cancelled login or did not fully authorize.');
}
}, {scope: 'email'});
}
Первоначально PHP-скрипт содержал два основных оператора Insert, которые вставляли эти детали в две таблицы в моей базе данных. Это работало отлично, но не было безопасно, поэтому вчера я написал вместо этого подготовленное заявление транзакции PDO. Позже я обнаружил, что мой механизм базы данных (MyISAM) не поддерживает операторы транзакций PDO, поэтому вместо этого я решил выполнить два запроса (которые вставили бы данные в две таблицы) внутри одного и того же сценария PHP (я знаю, что это не так). лучшая практика, но я не смог найти способ заставить транзакции PDO работать с MyISAM).
Это часть, которая меня смущает: при тестировании нового PHP-файла я обнаружил, что он отлично работает при открытии страницы в Chrome, однако не работает с Firefox, IE или Safari.
PHP скрипт
<?php
$servername = "myserver";
$username = "myusername";
$password = "mypassword";
$dbname = "mydatabase";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// prepare sql and bind parameters for 1st insert
$stmt = $conn->prepare("INSERT INTO user (fb_id, f_name, l_name, email, gender)
VALUES (:fb_id, :firstname, :lastname, :email, :gender)");
$stmt->bindParam(':fb_id', $userid);
$stmt->bindParam(':firstname', $userfirst_name);
$stmt->bindParam(':lastname', $userlast_name);
$stmt->bindParam(':email', $useremail);
$stmt->bindParam(':gender', $usergender);
// insert a row
$userid = $_POST['userid'];
$userfirst_name = $_POST['userfirst_name'];
$userlast_name = $_POST['userlast_name'];
$useremail = $_POST['useremail'];
$usergender = $_POST['usergender'];
$stmt->execute();
// prepare sql and bind parameters for 2nd insert
$stmt = $conn->prepare("INSERT INTO orders (fb_id, cb, gb, invite)
VALUES (:fb_id, :cb, :gb, :invite)");
$stmt->bindParam(':fb_id', $userid);
$stmt->bindParam(':cb', $cb);
$stmt->bindParam(':gb', $gb);
$stmt->bindParam(':invite', $inviteo);
// insert a row
$userid = $_POST['userid'];
$cb = "1";
$gb = "10";
$inviteo = "0";
$stmt->execute();
echo "1";
}
catch(PDOException $e)
{
echo "Error: " . $e->getMessage();
}
$conn = null;
?>
Как только операторы вставки завершены, я отправляю эхо обратно в функцию Javascript, а затем на экране появляется предупреждение Javascript, чтобы сообщить мне, была ли вставка успешной или нет. Это прекрасно работает в Chrome, но я не получаю никаких предупреждений с остальными тремя браузерами, и при попытке их использования ничего не вводится в базу данных. Тот факт, что нет никаких предупреждений о том, что это не удалось, заставляет меня думать, что ошибка в том, что Javascript не работает с браузерами, но опять же, он прекрасно работал во всех браузерах, прежде чем я переключил PHP на PDO.
Я убедился, что Javascript включен, всплывающие окна не заблокированы, и я попытался посмотреть на консоль в Firefox, но я не вижу, что может быть не так.
Любая помощь или совет по этому вопросу были бы великолепны. Заранее спасибо!
Задача ещё не решена.
Других решений пока нет …