Как создать строку запроса с JavaScript

Когда вы объявляете ссылочную переменную (т. е. объект), вы действительно создаете указатель на объект. Рассмотрим следующий код, в котором вы объявляете переменную примитивного типа int:

int x;
x = 10;

В этом примере переменная x является int, и Java инициализирует ее для 0. Когда вы назначаете его 10 во второй строке, ваше значение 10 записывается в ячейку памяти, на которую указывает x.

Но когда вы пытаетесь объявить ссылочный тип, произойдет что-то другое. Возьмите следующий код:

Integer num;
num = new Integer(10);

Первая строка объявляет переменную с именем num, но она не содержит примитивного значения. Вместо этого он содержит указатель (потому что тип Integer является ссылочным типом). Поскольку вы еще не указали, что указать на Java, он устанавливает значение null, что означает «Я ничего не указываю».

Во второй строке ключевое слово new используется для создания экземпляра (или создания ) объекту типа Integer и переменной указателя num присваивается этот объект. Теперь вы можете ссылаться на объект, используя оператор разыменования . (точка).

Exception, о котором вы просили, возникает, когда вы объявляете переменную, но не создавали объект. Если вы попытаетесь разыменовать num. Перед созданием объекта вы получите NullPointerException. В самых тривиальных случаях компилятор поймает проблему и сообщит вам, что «num не может быть инициализирован», но иногда вы пишете код, который непосредственно не создает объект.

Например, вы можете имеют следующий метод:

public void doSomething(SomeObject obj) {
   //do something to obj
}

В этом случае вы не создаете объект obj, скорее предполагая, что он был создан до вызова метода doSomething. К сожалению, этот метод можно вызвать следующим образом:

doSomething(null);

В этом случае obj имеет значение null. Если метод предназначен для того, чтобы что-то сделать для переданного объекта, целесообразно бросить NullPointerException, потому что это ошибка программиста, и программисту понадобится эта информация для целей отладки.

Альтернативно, там могут быть случаи, когда цель метода заключается не только в том, чтобы работать с переданным в объекте, и поэтому нулевой параметр может быть приемлемым. В этом случае вам нужно будет проверить нулевой параметр и вести себя по-другому. Вы также должны объяснить это в документации. Например, doSomething может быть записано как:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj != null) {
       //do something
    } else {
       //do something else
    }
}

Наконец, Как определить исключение & amp; причина использования Трассировки стека

135
задан Taryn 16 July 2013 в 19:45
поделиться

7 ответов

Я пытался искать ответ на этот вопрос некоторые, в то время как назад, но я закончил тем, что писал свою собственную функцию, которая извлекает значения из формы..

это не прекрасно, но это соответствует моим потребностям.

function form_params( form )
{
    var params = new Array()
    var length = form.elements.length
    for( var i = 0; i < length; i++ )
    {
        element = form.elements[i]

        if(element.tagName == 'TEXTAREA' )
        {
            params[element.name] = element.value
        }
        else if( element.tagName == 'INPUT' )
        {
            if( element.type == 'text' || element.type == 'hidden' || element.type == 'password')
            {
                params[element.name] = element.value
            }
            else if( element.type == 'radio' && element.checked )
            {
                if( !element.value )
                    params[element.name] = "on"
                else
                    params[element.name] = element.value

            }
            else if( element.type == 'checkbox' && element.checked )
            {
                if( !element.value )
                    params[element.name] = "on"
                else
                    params[element.name] = element.value
            }
        }
    }
    return params;
}

form_params возвращается (ключ-> значение) отображение параметров. вход является элементом формы (Элемент DOM)

, Он не обрабатывает поля, которые позволяют множественный выбор.

-8
ответ дан 23 November 2019 в 23:41
поделиться

Для тех из нас, кто предпочитает jQuery, Вы использовали бы плагин формы: http://plugins.jquery.com/project/form , который содержит formSerialize метод.

2
ответ дан 23 November 2019 в 23:41
поделиться

Как Stein говорит, можно использовать прототип библиотека JavaScript от http://www.prototypejs.org . Включайте JS, и это очень просто затем, $('formName').serialize() возвратит то, что Вы хотите!

3
ответ дан 23 November 2019 в 23:41
поделиться

Я не совсем уверен сам, я вспоминаю наблюдение, что jQuery сделал это до степени, но это не обрабатывает иерархические записи вообще, уже не говоря о php дружественным способом.

Одна вещь я действительно знаю наверняка, при создании URL и засовывании продукта в dom, только используйте строковое связующее звено, чтобы сделать это, или Вы будете открывать себя для удобного прерывателя страницы.

, Например, определенное рекламное программное обеспечение встраивает строку версии от любых выполнений Ваша флэш-память. Это прекрасно, когда его Adobe универсальная простая строка, но однако, это очень наивно, и аварийно завершается в смущающей путанице для людей, кого установил Скрежет, как это gnash'es строка версии, оказывается, содержит полноценное авторское право GPL лицензии, вместе с URL и < href> теги. Используя это в Вашем генераторе рекламодателя строкового связующего звена, результаты на странице распахивающий и имеющий несбалансированный HTML, поднимающийся в dom.

мораль истории:

   var foo = document.createElement("elementnamehere"); 
   foo.attribute = allUserSpecifiedDataConsideredDangerousHere; 
   somenode.appendChild(foo); 

Нет:

   document.write("<elementnamehere attribute=\"" 
        + ilovebrokenwebsites 
        + "\">" 
        + stringdata 
        + "</elementnamehere>");

Google должен изучить этот прием. Я пытался сообщить о проблеме, они, кажется, не заботятся.

3
ответ дан 23 November 2019 в 23:41
поделиться

Если Вы не хотите пользоваться библиотекой, это должно покрыть большинство/все те же типы элемента формы.

function serialize(form) {
  if (!form || !form.elements) return;

  var serial = [], i, j, first;
  var add = function (name, value) {
    serial.push(encodeURIComponent(name) + '=' + encodeURIComponent(value));
  }

  var elems = form.elements;
  for (i = 0; i < elems.length; i += 1, first = false) {
    if (elems[i].name.length > 0) { /* don't include unnamed elements */
      switch (elems[i].type) {
        case 'select-one': first = true;
        case 'select-multiple':
          for (j = 0; j < elems[i].options.length; j += 1)
            if (elems[i].options[j].selected) {
              add(elems[i].name, elems[i].options[j].value);
              if (first) break; /* stop searching for select-one */
            }
          break;
        case 'checkbox':
        case 'radio': if (!elems[i].checked) break; /* else continue */
        default: add(elems[i].name, elems[i].value); break;
      }
    }
  }

  return serial.join('&');
}
6
ответ дан 23 November 2019 в 23:41
поделиться

Вам на самом деле не нужна форма, чтобы сделать это с Прототипом. Просто используйте функция Object.toQueryString :

Object.toQueryString({ action: 'ship', order_id: 123, fees: ['f1', 'f2'], 'label': 'a demo' })

// -> 'action=ship&order_id=123&fees=f1&fees=f2&label=a%20demo'
5
ответ дан 23 November 2019 в 23:41
поделиться

Нет, я не думаю, что стандартному JavaScript встроили это, но Прототип, JS имеет ту функцию (конечно, большинство других платформ JS имеет также, но я не знаю их), они звонят, это сериализирует .

я могу reccomend Прототип JS, он работает вполне хорошо. Единственный недостаток я действительно заметил его, это - размер (несколько сотен Кбит) и объем (много кода для ajax, dom, и т.д.). Таким образом, если Вы только хотите сериализатор формы, это - излишество, и строго говоря если Вы только хотите, это - функциональность Ajax (ведьма главным образом, что я использовал его для), это - излишество. Если Вы не осторожны, можно найти, что это делает немного слишком много "волшебства" (как расширение каждого dom элемента, это касается с Прототипом функций JS только для нахождения элементов), то, чтобы заставлять это замедлиться на крайних случаях.

10
ответ дан 23 November 2019 в 23:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: