#javascript #html
#javascript #HTML
Вопрос:
У меня есть требование, подобное этому
Количество строк, генерируемых в таблице, динамически зависит от пользователя, в одном сценарии будет один TR, некоторое время 4 TRs или некоторое время 8 TRs..
Может быть не более 10 TR, и в каждом TR будет по 6 Tds, Каждый TD будет содержать выпадающие элементы или переключатели, выбор каждого из элементов в TD приведет к отображению следующего TD в той же строке (TRs) или нет.
ДЛЯ реализации вышесказанного я использую теги Div и с их помощью скрываю их или делаю видимыми
Проблема, с которой я сталкиваюсь
1) Я не могу создать уникальный идентификатор для всех TD во всех 10 TR, из-за чего, если я скрою один идентификатор класса одного TD во 2-м TR, то он также скроет соответствующие 2-е TDS в следующих последовательных TR.
Это из-за идентификатора класса, который я генерирую программно в цикле FOR.
Не могли бы вы, пожалуйста, подсказать мне, как я могу приступить к реализации этого требования???
2) Можем ли мы указать идентификатор для TD во время выполнения??
Комментарии:
1. Итак, вам нужно добавлять динамические столбцы и строки во время выполнения, это ваш вопрос, верно?
2. Если вы опубликуете свой текущий код, люди могут предложить способы его улучшения.
3. Некоторый код был бы полезен при оценке возможных решений. Тем временем я представлю, что дело полностью написано на JavaScript.
4. Я еще ничего не начал, я все еще разрабатываю наилучшие способы реализации этого требования
5. @ Tj, поскольку я не написал код, я не могу его опубликовать, я проверяю различные способы реализации этого требования
Ответ №1:
Приведенная ниже схема представляет собой очень элементарную программу создания элементов. Он будет работать для создания HTML-документа на основе определенных пользовательских данных. http://jsfiddle.net/3rvDk /
(function(){
function get_element_id( elem ) {
return Number(elem.id.split('_')[1]);
}
/**
* build_guid_generator
*
* @returns {Function} to generate global unique identifiers with
*/
function build_guid_generator(){
var named_ids = {};
var i = 0;
return function( ns ){
named_ids[ns] = named_ids[ns] || 0;
return named_ids[ns] ;
};
}
var guid = build_guid_generator();
/**
* build_drop_down
*
* creates a <select> HTML Element with global unique identifier
* options is an object literal whose keys become the text of the option
*
* @param {HTMLElement} container
* @param {Object} options
* @param {Function} change_event - function to execute when the value is changed
*/
function build_drop_down( container, options, change_event ) {
var ddl = document.createElement('select');
ddl.id = 'ddl_' guid('ddl');
for( var option in options ) if ( options.hasOwnProperty( option ) ) {
var opt = document.createElement('option');
opt.text = option;
opt.value = options[option];
ddl.add(opt, null);
}
ddl.hide = function(){
this.setAttribute('style','display:none;');
};
ddl.show = function(){
this.setAttribute('style','');
};
container.appendChild( ddl );
ddl.onchange = change_event;
if ( get_element_id( ddl ) > 0 ) {
ddl.setAttribute('style','display:none;');
}
return ddl;
}
/**
* build_cell
*
* creates a <td> HTML Element with global unique identifier and attaches to container
*
* @param {HTMLElement} container
*/
function build_cell ( container ) {
var td = document.createElement('td');
td.id = 'cell_' guid('td');
container.appendChild( td );
return td;
}
/**
* build_row
*
* creates a <tr> HTML Element with global unique identifier and attaches to container
*
* @param {HTMLElement} container
*/
function build_row ( container ) {
var tr = document.createElement('tr');
tr.id = 'row_' guid('tr');
container.appendChild( tr );
return tr;
}
var user_data = {
rows : 10,
cells : 6,
options : {
'off' : false,
'test' : 'value'
}
};
function test_data_set ( data ) {
var container = document.createElement('div');
container.id = 'container';
document.body.appendChild( container );
var i = 0;
for ( ; i < data.rows ; i ) {
var tr = build_row( container ),
j = 0;
for( ; j < data.cells ; j ) {
var td = build_cell( tr );
build_drop_down( td, data.options, function( event ) {
console.log( this.value );
var next_sibling = document.getElementById( 'ddl_' ( get_element_id( this ) 1 ) );
console.log( next_sibling );
if ( this.value === 'false' ) {
next_sibling.hide();
} else {
next_sibling.show();
}
});
}
}
}
test_data_set( user_data );
})();
Ответ №2:
Решения по кодированию в сторону… Попробуйте использовать class
вместо id
, тогда вы сможете воспользоваться this
селектором через JS.
Ответ №3:
@harigm, поскольку вы просили опубликовать код, который я разместил, чисто это не связано с javascript. Но Asp.net и VB.
Protected Sub btnNew_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnNew.Click ''On New button or Cancel Button click
Dim dt As DataTable
Dim selIndex As Integer
If btnNew.Text = "New" Then ''when New button is clicked
Try
btnChangePwd.Enabled = False
DGLogin.Width = 1250
selectedindexval = True
DGLogin.Columns.Item(4).Visible = True
DGLogin.Columns.Item(5).Visible = True
btnDelete.Enabled = False
btnDeleteAll.Enabled = False
Bind()
dt = Session("datatab")
selIndex = dt.Rows.Count Mod DGLogin.PageSize
DGLogin.CurrentPageIndex = dt.Rows.Count DGLogin.PageSize
DGLogin.SelectedIndex = selIndex
DGLogin.EditItemIndex = DGLogin.SelectedIndex
Dim dr As DataRow = dt.NewRow()
dr("Userid") = String.Empty
dr("UserName") = String.Empty
dr("UserType") = String.Empty
dr("Password") = String.Empty
dr("EmailAlert") = False
dr("EmailID") = String.Empty
dr("SmsAlert") = False
dr("PhoneNumber") = String.Empty
dr("AlertOnWeekDays") = False
dt.Rows.Add(dr)
DGLogin.DataSource = dt
DGLogin.DataBind()
Dim ddlusType As DropDownList = DirectCast(DGLogin.Items(DGLogin.SelectedIndex).Cells(4).FindControl("ddlUserType"), DropDownList)
ddlusType.Items.Remove("Administrator")
ddlusType.Items.Remove("VP")
Dim cnt As Integer = DGLogin.Items.Count
For index As Integer = 0 To cnt - 1
Dim lblPwd As Label = DirectCast(DGLogin.Items(index).Cells(5).FindControl("lblpwd"), Label)
Dim lblconfirmPwd As Label = DirectCast(DGLogin.Items(index).Cells(6).FindControl("lblconfirmpwd"), Label)
If lblPwd IsNot Nothing Then
If lblPwd.Text <> "" Then
Dim length As Integer = lblPwd.Text.Length
Dim strPwd As String = ""
For ind As Integer = 0 To length - 1
strPwd = "*"
Next
lblPwd.Text = strPwd
lblconfirmPwd.Text = strPwd
End If
End If
Next
Dim chkemail As CheckBox = DirectCast(DGLogin.Items(DGLogin.SelectedIndex).Cells(7).FindControl("chkemailalertEdit"), CheckBox)
Dim txtphone As TextBox = DirectCast(DGLogin.Items(DGLogin.SelectedIndex).Cells(10).FindControl("txtPhonenumber"), TextBox)
Dim chksms As CheckBox = DirectCast(DGLogin.Items(DGLogin.SelectedIndex).Cells(9).FindControl("chkSmsalertEdit"), CheckBox)
Dim EmailID As TextBox = DirectCast(DGLogin.Items(DGLogin.SelectedIndex).Cells(8).FindControl("txtemailid"), TextBox)
Dim chkalertonweekdays As CheckBox = DirectCast(DGLogin.Items(DGLogin.SelectedIndex).Cells(11).FindControl("chkWeekdaysEdit"), CheckBox)
chkalertonweekdays.Enabled = True
chkemail.Enabled = False
txtphone.Enabled = False
chksms.Enabled = False
EmailID.Enabled = False
Dim txtusrid As TextBox = CType(DGLogin.Items(DGLogin.EditItemIndex).Cells(2).FindControl("txtuserid"), TextBox)
txtusrid.Enabled = True
txtusrid.Focus()
txtusrid.Enabled = True
Session("newrowadded") = True
btnDelete.Enabled = False
btnDeleteAll.Enabled = False
btnNew.Text = "Cancel"
btnEdit.Text = "Save"
Session("soted") = False
disablecheckbok()
btnNext.Enabled = False
btnlast.Enabled = False
'btnfirst.Enabled = True
'btnprevious.Enabled = True
navigationButtouns()
Catch ex As Exception
UserMsgBox(ex.Message)
WriteToLog(ex.Message)
End Try
ElseIf btnNew.Text = "Cancel" Then 'On click of Cancel Buttoun
Try
DGLogin.Width = 850
selectedindexval = False
DGLogin.SelectedIndex = -1
If (Session("newrowadded") = True) Then
If (DGLogin.EditItemIndex = 0) Then
DGLogin.CurrentPageIndex = 0
End If
End If
btnChangePwd.Enabled = True
Bind()
DGLogin.Columns.Item(4).Visible = False
DGLogin.Columns.Item(5).Visible = False
DGLogin.EditItemIndex = -1
DGLogin.DataBind()
btnDelete.Enabled = True
btnDeleteAll.Enabled = True
btnNew.Text = "New"
btnEdit.Text = "Edit"
btnEdit.Enabled = True
lblerror.Text = ""
Session("soted") = False
enablenavigationbuttouns()
afterselectionchanged()
EnableCheckBox()
Catch ex As Exception
WriteToLog(ex.Message)
End Try
End If
End Sub
И это пример добавления новой строки в сетку при каждом нажатии новой кнопки, и добавление столбцов в сетку будет обычным на странице aspx.
Комментарии:
1. @ Спасибо, Кальян, дай мне проверить