Страница зависает после отправки формы - PullRequest
0 голосов
/ 11 июня 2011

У меня есть скрипт со следующим содержанием:

    <?php
if(isset($_POST['sent-urls']) || $_POST['sent-urls'] == true)
{
    session_start();
    error_reporting(E_ALL);
    //ini_set('display_errors', 'Off');

    include('includes/functions.php');

    $url = str_replace('www.', '', url());
    $images = explode("\n", $_POST['remote-urls']);

    if(sizeof($images) > 30) {
      $url_i = $url_t = $direct = 'You have added mroe than 30 links';
    }

    $links = array();
    foreach($images as $image) 
    {
      $srcfile = (isset($image)) ? trim($image) : '';
      $extension = remoteEx($srcfile);
      $filename = rand(124588, 543354) . '.' . remoteEx($image);
      $file = remote_filesize($srcfile);

      if ($file <= 3000000 && !empty($srcfile) && $extension == 'png' || $extension == 'peg' || $extension == 'jpg' || $extension == 'gif' || $extension == 'bmp')
      {
        $copied = copy($srcfile, 'i/' . $filename);

        $direct = $url . 'i/' . $filename;
        $url_i = $url . 'i/' . $filename . "\n";

        if ($copied)
        {
            // make_thumb($direct, 't/' . $filename, 150, remoteEx($direct));   
            generate_thumbnail($image, $filename, 110, 110, true, 'file', false, false, '');
            $url_t = $url . 't/' . $filename . "\n";
        }
      }
      else if (empty($srcfile))
      {
        $url_i = $url_t = $direct = 'No links added';  
      }
      else if ($file > 3000000)
      {
        $url_i = $url_t = $direct = 'Maximum size of photos exceed';  
      }
      else 
      {
        $url_i = $url_t = $direct = 'There was an error while submitting the form';  
      }

      $links[] = array('direct' => $direct, 'thumb' => $url_t);
    }

    if ($file > 3000000) { echo 'You have exceed the limit of the file size'; } 
        echo '<br /><br />';
        echo '<div id="links">';
        echo '<table>';
        echo "<tr><td><span class=\"green\">Direct:</span> <textarea class=\"link-area\" readonly=\"readonly\" onMouseOver=\"this.focus(); this.select(); $(this).css('height', '50px');\" onmouseout=\"$(this).animate({ height: '25px' }, 'fast'); $(this).blur();\">";
        for($i = 0; $i < count($links); $i++) { echo $links[$i]['direct'] . "\n"; }
        echo '</textarea></td></tr>';

        echo "<tr><td><span class=\"green\">Thumbnail:</span> <textarea class=\"link-area\" readonly=\"readonly\" onMouseOver=\"this.focus(); this.select(); $(this).css('height', '50px');\" onmouseout=\"$(this).animate({ height: '25px' }, 'fast'); $(this).blur();\">";
        for($i = 0; $i < count($links); $i++) { echo $links[$i]['thumb'] . "\n"; }
        echo '</textarea></td></tr>';

        echo "<tr><td><span class=\"green\">BBCode:</span> <textarea class=\"link-area\" readonly=\"readonly\" onMouseOver=\"this.focus(); this.select(); $(this).css('height', '50px');\" onmouseout=\"$(this).animate({ height: '25px' }, 'fast'); $(this).blur();\">"; 
        for($i = 0; $i < count($links); $i++) { echo '[IMG]' . $links[$i]['direct'] . '[/IMG]' . "\n"; } 
        echo '</textarea></td></tr>';

        echo "<tr><td><span class=\"green\">HTML:</span> <textarea class=\"link-area\" readonly=\"readonly\" onMouseOver=\"this.focus(); this.select(); $(this).css('height', '50px');\" onmouseout=\"$(this).animate({ height: '25px' }, 'fast'); $(this).blur();\">";
        for($i = 0; $i < count($links); $i++) { echo '<a href="' . $links[$i]['direct'] . '"><img src="' . $links[$i]['thumb'] . '" /></a>' . "\n"; }
        echo '</textarea></td></tr>';

        echo '</table>';
        echo '<script type="text/javascript" src="scripts/img.core.js"></script>';
        echo '<script type="text/javascript" src="scripts/jquery-1.5.js"></script>';
        echo '<input type="reset" id="resetbtn-remote" class="button-sub" value="Reset" />';
        echo '<br />';
        echo '</div>';
}
else 
{
    header('Location: index.php');  
}
?>

И скрипт вызывается этой формой:

<div id="remote" style="display: none;">
    <form action="remote.php" method="post" id="remote-upload">
        <br /><br />
        <textarea name="remote-urls" id="remote-urls" rows="12"></textarea><br/>
        <input type="button" name="remote-start" id="remote-start" class="remote-button" value="Upload Images" />
        <input type="hidden" name="sent-urls" value="1" />
        <input type="reset" id="remote-reset" class="remote-button" value="Reset" style="display: none;" />
        <br /><br />
        <span class="normal">
            Maximum <strong>20</strong> images.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>10 MB</strong> for one image.
        </span>
    </form>
        <div id="remoted">
            <img id="loader1" src="css/images/loader.gif" style="display: none;" />
        </div>
    </div>

Форма связана с плагином jQuery, который отправляет данные из формы без обновления страницы. Я нажимаю кнопку запуска #remote, показывает загрузчик, и через несколько секунд страница зависает и становится недоступной в течение ~ 4 секунд, затем страница размораживается с желаемыми результатами.

Что может вызывать зависание страницы?

РЕДАКТИРОВАТЬ: JavaScript такой:

$('#remote-start').live('click', function() {
    $('#loader1').show();
    $(this).hide();
    $('#remote-reset').show();
    $('#remote-upload').ajaxSubmit({
        target: '#remoted',
        success: function(response) {
            $('#remoted').html(response).hide().slideDown('fast');
            $('#loader1').fadeOut('normal');
        }
    });
});

$('#remote-reset').live('click', function() {
    $('#remote-urls').empty();
    $('#remoted').slideUp('medium', function() {
        $(window.location).attr('href', 'http://localhost/imagehost');
    });
});

$('#resetbtn-remote').live('click', function() {
    $('#remote-urls').empty();
    $('#remoted').slideUp('medium', function() {
        $(window.location).attr('href', 'http://imgit.org');
    });
});

1 Ответ

2 голосов
/ 12 июня 2011

Трудно сказать, но я предполагаю, что ваш "плагин jQuery, который отправляет данные из формы без обновления страницы", вызывает $.ajax с async:false:

Обратите внимание, что синхронные запросы могут временно блокировать браузер, отключая любые действия, когда запрос активен.

Плагин использует AJAX и приведенный выше отрывок из документации $.ajax звучит так же, как выВижу.

...